Только что портил некоторые тулзы, обрабатывающие генетическую информацию с ANSI C на джаву, строка-в-строку.
И был очень удивлён, что разница - в пределах ошибки.
Тулзы типа транспонируют матрицы, ну просто крутят данные, а данных могут быть многие гигабайты. Только одна строка - порядка миллиона аллелей, а их может быть много.
Дык вот, на Си, скажем, миллион рекордов обрабатывается в 1.5-1.8 секунд. На джаве - 2.5 секунд вместе с загрузкой виртуальной машины, но саму строку обрабатывает 1.8 секунд (колеблется в приделах 20% в моём ленивом семпле из 5 запусков). Т.е. когда количество строк будет очень большим - загрузкой VM можно пренебречь, а данные колошматят как Си (gcc -O2) и джава - с одинаковой скоростью.
Детали: маллоками не пользуюсь, всё делаю на стеке. В джаве тоже всё в стиле Си (немногие классы - как сишные структуры с публичным доступом - на частые операции, в основном - функции). Никакого юникода (его в тех форматах не предвидится), поэтому читаю асками, как intы и кастю в char под конец, только что нужно. Т.е. оптимизированнее некуда.
Этак можно на Си забить для подобных задач (я давно тестил одну и ту же большую экстракцию данных из базы - разницы не заметил, но там ясно: чистое ожидание IO, в базах на Си давно забил. Потом тестил хэши, работа с большимы хешами также в джаве оказалась даже быстрее). А тут такое. С большими локальными файлами и их обработке. Однако...