Измерение производительности - сложный вопрос. В прошлом, когда языки тестировались на одной и той же операционной системе, на одном и том же оборудовании и на очень ограниченном наборе библиотек, можно было создавать тесты, которые могли бы дать линейный показатель, который бы измерял систему. Это позволило бы людям оценивать вещи от нуля до десяти, ассимилировать результат и быстро переходить к следующему предмету.
Вещи стали более сложными с современными системами, поскольку необходимо учитывать множество переменных.
По крайней мере, в случае с Моно, в игру вступает множество переменных:
Код:
- Качество сгенерированного собственного кода.
- Скорость, с которой генерируется собственный код.
- Память, необходимая для генерации кода и оптимизации кода
- Является ли генератор кода многопоточным
- Является ли сгенерированный код потокобезопасным
- Использует ли он особые функции процессора во время компиляции или во время JIT.
- Может ли он использовать SIMD-инструкции, если они доступны.
- Соответствует ли язык сам по себе многоядерным платформам
- Предоставляет ли язык достаточно параметров для оптимизатора для автоматической настройки вашего кода (как это делает Fortran).
Управление памятью:
- Используемый алгоритм сборки мусора
- ГХ масштабируется с несколькими ЦП?
- Является ли ГХ инкрементным или в реальном времени?
- Поддерживает ли локальное хранилище потоков для повышения производительности?
- Является ли он точным, компактным, поколенческим, консервативным и что смешивает каждый.
Дизайн API:
- Разработаны ли API для задержки или пропускной способности
- Поддерживают ли API-интерфейсы автоматическое масштабирование до нескольких процессоров.
- Можете ли вы перенести тяжелую работу на графический процессор?
- Поддерживают ли ваши API потоковые интерфейсы
Все эти вещи очень усложняют ситуацию и затрудняют получение простого ответа от 0 до 10.
Если бы вы разделили языки на классы, и вы предполагаете, что вы обладаете компетентностью и эффективностью, я бы поделил мир на эти классы:
- Уровень 1: Язык ассемблера, настроенный вручную профессионалом
- Уровень 2: Статически скомпилированные, строго типизированные языки: C / C ++ / Fortran /
- Уровень 3: управляемые / JIT языки: Java / C # /. NET / Mono / Boo / F #
- Уровень 4: языки с динамической типизацией и JIT: Google V8, IronPython, IronRuby
- Уровень 5: чисто интерпретируемые языки: Python, Perl
- Уровень 6: чисто интерпретируемые языки со слишком большим количеством функций для их собственной пользы.
Но языки не рисуют всю картину, API-интерфейсы, которые вы будете использовать, операционная система хостинга и другие средства будут иметь большое влияние на ваши результаты.
Например, недавно в Mono мы добавили поддержку замены движка кода Gen Mono на более продвинутый, высокооптимизируемый движок (движок LLVM). Оказывается, было невероятно сложно найти тест, в котором затраты на использование LLVM стоили дополнительного использования памяти: настольные и веб-приложения не продемонстрировали большой разницы. И это, вероятно, связано с тем, что это в основном приложения, связанные с вводом / выводом.
Использование LLVM было полезно для научных и вычислительных приложений, но в реальной жизни это не сильно отличалось от настроек оптимизации Mono по умолчанию.
Что касается специфики Mono: хотя Mono действительно использует GC от Boehm, большинство людей не осознают, что Boehm можно настроить различными способами. Стандартная конфигурация непрофессионала действительно не очень мощная, но она работает для всех, кто хочет быстрый сборщик мусора. Mono не использует Boehm в этом режиме, Mono настраивает Boehm для работы в точном режиме, а также использует преимущества потокового локального хранилища, многоядерного ГХ и режимов освобождения памяти для ОС.