Стандартный (простой?) Код теста / тест? - PullRequest
6 голосов
/ 12 июня 2011

Существует ли какая-то стандартная система тестирования или схема или что-то в этом роде?Я смотрю на go, llvm, d и другие языки, и я хотел знать, насколько они справедливы во времени выполнения, использовании памяти и т. Д.

Я нашел https://benchmarksgame -team.pages.debian.net / benchmarksgame / но код НЕ ЖЕ.Одним из примеров является то, что источник C ++ имеет размер <100 строк, а источник C> 650.Я не могу назвать это справедливым.У другого теста в его источнике есть глупая ошибка, заключающаяся в том, что он помещает блокировку в цикл, в то время как другие языки помещают ее снаружи.

Итак, я хотел бы узнать какой-нибудь тест, который я мог бы рассмотреть, просматривая / выполняя, который, возможно, не использует нестандартных илисложные библиотекиКак реализовано полностью внутри одного исходного файла.Нечто справедливое.

Ответы [ 2 ]

7 голосов
/ 17 июня 2011

В течение нескольких лет веб-сайт тестовых игр показывал это на странице справки -

Что значит "несправедливо"? (Басня)

Они мчались вверх и вниз, и вокруг, и вокруг, и вокруг, и вперед, и назад, и вбок, и вверх ногами.

Друзья Гепарда сказали "это нечестно" - все знают, что Гепард - самое быстрое существо, но гонки слишком длинные, и Гепард устает!

Друзья Сокола сказали "это нечестно" - все знают, что Сокол - самое быстрое существо, но Сокол не очень хорошо ходит, он парит по небу!

Друзья Лошади сказали "это нечестно" - все знают, что Лошадь - самое быстрое существо, но это всего лишь годовалый год, вы должны остановить скачки, пока не примет участие жеребец!

Друзья человека сказали "это нечестно" - все знают, что в "реальном мире" Человек будет использовать мотоцикл, вы должны подождать, пока Человек не заправит и не прогреет двигатель!

Друзья Улитки сказали "это нечестно" - все знают, что существо должно оставить след слизи, все остальные существа обманывают!

Хвост Далматина стучал по земле. Далматин вздохнул и между вдохами сказал: «Посмотри на эту прекрасную гору, давай мчимся на вершину!»


В то время комментарии «это нечестно» были в основном специальными мольбами, предназначенными для того, чтобы получить преимущество для языка программирования X перед недостатком языка программирования Y.

Но проблемы, поднятые вашим вопросом, немного отличаются.

  1. Во-первых, посмотрите на n-body программы на тестах игры Веб-сайт. Хотя программы написаны на разных языках есть очень маленькая разница способ кодирования программ.

    Пока никто не нашел эффективный способ использовать четырехъядерный для эта маленькая проблема n-тела - так что нет специальных многоядерных программ. Программы не используют нестандартные или сложные библиотеки. Программы полностью реализованы внутри один исходный файл.

  2. Я сказал, что очень мало Разница в способе н-тела программы закодированы, но делает это действительно означает, что программы являются так же? Вскоре после того, как проект был возрожден, 6 или 7 лет назад я помните ада программист полушутя о сравнении яблок с апельсины, потому что ассемблер из программ Ада не было такой же, как язык ассемблера от C программы - так очевидно, что не было по сравнению с как: -)

    • otoh исходный код Ады будет иметь быть написанным по-другому чем был написан исходный код C, чтобы компилятор Ada создавал тот же язык ассемблера, что и компилятор C производства.

    • otoh если язык ассемблера создан оба компилятора действительно были построчными то же самое, почему бы разница в производительности?

    Когда на пути очень мало различий программы закодированы, то на первый взгляд сравнение представляется справедливым, но принудительным разные языки должны быть закодированы как язык X может отдавать предпочтение языку X.

  3. Как отметил Янник Версли, точка использования другого языка для различные подходы, которые язык обеспечивает. Другими словами, есть более чем один способ сделать то же самое.

    Посмотрите на программы Мандельброта на веб-сайт игры тестов - простейшая программа на C в два раза меньше самой быстрой C-программы; Простейшая C программа является последовательной и использует doubles, самая быстрая программа на C использует все 4 ядра через OMP и GCC встроенные функции.

    • Другие языки используют различные подходы для использования всех 4 ядер - означает ли это, что мы должны сравнивать только последовательные программы и игнорировать реальность многоядерных вычислений?

    • Реализация на других языках может не обеспечивать эквивалент встроенных функций GCC. Означает ли это, что мы должны сравнивать только те программы, которые используют double? Но в других языковых реализациях используется различных подходов в том смысле, в каком они представляют удваивается - означает ли это, что мы должны игнорировать все программы с плавающей запятой?

Проблема в том, что языки программирования (и реализации языков программирования) больше чем яблоки от апельсинов, но мы все еще спрашиваем - Будет ли моя программа быстрее, если я напишу ее на языке X? - и все же желаю более простого ответа, чем - Зависит от того, как вы его напишите!

Различные задачи и разные программы на веб-сайте тестовых игр показывают, что некоторые из сравнений производительности ответов запутаны и сложны - детали имеют значение, очень много.

5 голосов
/ 12 июня 2011

Бенчмаркинг - это не только честность, это выбор чего-то для своей работы, в пределах своих ограничений.

Если вы хотите использовать сайт перестрелки alioth, вы все равно можете получить интересную информацию, если исключите слишком подробные или слишком медленные решения (точная балансировка зависит от того, что вы хотите сделать - вы пишете код, который выполняется для пять секунд или тот, который будет занимать десяток компьютеров в течение пяти месяцев). Посмотрите краткие примеры для одной конкретной проблемы, чтобы увидеть общую структуру проблемы, а затем посмотрите, какие типичные оптимизации применяли люди, чтобы заставить код работать быстрее.

Наличие эталонного кода с ОДНИМ ЖЕ кодом не имеет смысла, потому что вам нужны разные вещи, чтобы помочь на разных языках; В Java есть GC, что означает, что он будет хорошо работать в тесте trees, в то время как вам нужно пользовательское выделение памяти в C / C ++, чтобы конкурировать с этим (и этот конкретный тест структурирован так, что стандартный malloc действительно плохо работает) spectral-norm один, вам нужны двойные массивы без коробок ...

Если вы хотите придумать свои собственные решения, попробуйте Project Euler - существует множество проблем, которые не зависят от сложных библиотек, но их сложно оптимизировать. В противном случае попробуйте найти критерии оценки, которые вы считаете достаточными для фильтрации или ранжирования существующих вкладов в перестрелке (или за ее пределами - например, существуют решения ShedSkin и Cython для некоторых проблем, которые являются «неофициальными», поскольку они языки не включены).

...