Кто сегодня самый шустрый?
От: Владислав Чистяков Российская Империя www.nemerle.org
Дата: 06.11.01 05:06
Оценка: 70 (6)
Статья:
Кто сегодня самый шустрый?
Автор(ы): Владислав Чистяков


Авторы:
Владислав Чистяков

Аннотация:
Как и зачем мы тестировали

Проанализировав ошибки, допущенные нашими предшественниками, мы пришли к выводу, что нужен не один интегральный тест, а несколько маленьких независимых тестов. Каждый из них должен (по возможности) представлять собой узкую, но часто встречающуюся задачу. Главной задачей тестирования было определение скорости выполнения одного и того же алгоритма, скомпилированного разными компиляторами. Сначала пример реализовывался на C++, после чего переписывался на другие языки. При этом стояла задача переписать как можно ближе к эталону.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
NOP != XOR AL, AL ==>> NOP == XCHG EAX, EAX
От: null  
Дата: 22.01.03 16:23
Оценка: +1
nop
От: elephantum  
Дата: 06.04.02 19:44
Оценка:
это конечно не суть важно, но имхо nop == xor al,al
...2b|!2b?
Неадекватность Судейства во втором тесте
От: AndryEs  
Дата: 17.02.02 21:53
Оценка:
Может быть еще test1 := CTest1.Create(); в теле цикла напишем????????
Хотя в таком виде при c_iCount = 1000000000 это test1 := CTest1.Create();
особо не влияет на результат.
Неадекватность Судейства во втором тесте:
От: AndryEs  
Дата: 17.02.02 21:49
Оценка:
Код в VC6
CTest1 test1;
m_spIUtility->TimerStart();
for(int i = 0; i < c_iCount; i++) { test1.Inc(); }
m_spIUtility->TimerEnd(/*sbsInfo*/);
И код в Delphi
Utility1.TimerStart();
test1 := CTest1.Create(); ==================>>>> Это уже предвзятость!!!!!!!
for i := 0 To c_iCount do begin test1.Inc_m_i(); end;
Utility1.TimerEnd();
Некорректности
От: Yury_Malich Германия http://malich.ru
Дата: 24.01.02 02:09
Оценка:
Откомпилировал MFC в C++Builder5, результаты очень близки к Делфи, чуть быстрее, но ниже, чем в VC6
"Практика — критерий истины" (c) Маркс
Некорректности
От: Yury_Malich Германия http://malich.ru
Дата: 24.01.02 02:07
Оценка:
И ещё
Опираясь на свой опыт инлайн не всегда увеличиван\ет произвадительность. Когда достаточно много локальных переменных, они не могут все размещатся в РОН(регистрах общего назначения, их же всего 7, не считая ESP), компилятору приходится использовать стек! Пример: писал один алгоритм, разбил его на две функции, не-инлайн, произфодительность выросла на 10%!.
"Практика — критерий истины" (c) Маркс
Некорректности
От: Yury_Malich Германия http://malich.ru
Дата: 24.01.02 02:01
Оценка:
Хочу добавить от себя
Совершенно очевидный промах во floating point тесте:

Вместо
for(int i = 0; i < iInitVal; i++)
{
f0 = (f1 / (double)i/*деление на ноль!*/) f2 + (f3 * (double)i);
}

нужно бы написать
for(int i = 1 i < iInitVal; i++)
{
f0 +=/*накапливать результат, чтобы использовалась f0!!!*/ (f1 /(double)i/*нет деления на ноль!*/) — f2 + (f3 * (double)i);
}
чтобы компилятор не отбрасывал результат f0!
При таком виде картина резко меняется и компилятор Intel оказывается на 2 месте!(77.8-VC6, 78.3-IntelC++5.0.1 на машине Celeron800)
"Практика — критерий истины" (c) Маркс
А что С++-калька Delphi BCBuilder?
От: Mikee  
Дата: 04.01.02 16:33
Оценка:
Какие бы результаты показал бы этот компилятор?
Компоненты у него вызываются от Дельфи, но приведенные примеры не используют VCL вообще.
Best regards,
Mikee
VS 6.0 и VS 7.0
От: Zilog™ Россия  
Дата: 07.11.01 23:53
Оценка:
PIII 833/133/512 812EB
Файл q3: 376 MB

VMC 15.2748 14.0067
QS 15.0631 14.2401
BS 7.0153 7.0838
CP 10.8238 5.7848
TT 150.6468 152.9681
ST 15.5359 7.5915
FT 39.5221 39.4377

VMC Virtual Method Call
QC QuickSort
BS Bubble Sort
CP Comput Pi
TT Tree Test
ST String Test
FT Float Test
Don't work hard, work smart.
Некорректность тестов (Part 1)
От: Аноним  
Дата: 07.11.01 05:09
Оценка:
Скачал тесты, и ожидаемо (из результатов тестов) нашел некоторые некорректности в реализации тестов:

1. Удивило преимущество Делфи в скорости доступа к данным класса, смотрим в реализацию и видим, в С++
переменная класса объявлена статически, тогда как в Делфи это указатель, меняем в С++ на
динамическое создание и получаем абсолютно идентичные показатели, что и не удивительно учитывая код.
Объясняется тем, что в случае указателя (Self, this) хранится в регистре, а в случае статической
переменной перед каждым вызовом его (this) надо достать из стека.

2. А заявление о блокировках в библиотеке выделения памяти при компиляции Release версии в VC смехотворны,
без них нельзя, причем НУ НИКАК НЕЛЬЗЯ в многопоточных приложениях. Хотел бы я посмотреть как вы сделаете
многопоточное приложение на Делфи без установки глобальной переменной IsMultiThreaded в True. А эта
Некорректность тестов (Part 3)
От: Аноним  
Дата: 07.11.01 05:07
Оценка:
Для неверующих могу выслать исходники.

Есть еще несколько мелких замечаний (описывать лень :))

И самое главное замечание: тесты реализовывались везде похожим способом, НО сравнивалась производительность
конечных приложений, поэтому нужно было реализовывать оптимальным способом в каждом из языков, с
использованием всех их возможностей, а так получалось что избранный вариант реализации подходил больше под
какой-то один или два языка, а для остальных можно было бы добиться лучших результатов пойдя другим путем
(возможно :))
Некорректность тестов (Part 2)
От: Аноним  
Дата: 07.11.01 05:06
Оценка:
переменная как раз и отвечает за применение блокировок при выделении памяти. Справка: создание потоков
через Делфийский BeginThread и класс TThread автоматом проставляет эту переменную, а тех кто случайно
создал потоки через WinAPI и не установил перем., того ждут очень веселые сюрпризы особенно на
многопроцессорных машинах.

3. Также весело выглядит Float-test. Неужели нельзя было взять РЕАЛЬНУЮ задачу, у меня есть алгоритм
нахождения точки пересечения двух отрезков, который реально применяется в решении реальных задач, причем
количество обращений к нему в процессе работы программы достаточно велико. Он был реализован на
VC6, Delphi5, VB6: так вот Delphi оказалась самой медленной, более того она проиграла VC в ТРИ раза.
Re: Некорректности
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.05.02 07:02
Оценка:
Да. Здесь все верно. Это промах. Интересно, что только bcc 5.5 выдал сообщение об ошибке. Остальные молча съели этот вариант и даже показали одинаковые результаты. При этом время выполнения теста Intel C++ compiler-ом изменилось. В третьей статье этого цикла приведен исправленный тест и корректировка выводов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Неадекватность Судейства во втором тесте:
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.05.02 06:58
Оценка:
Во-первых это уже давно исправлено (см. код к третей версии статьи). Во-вторых, ты соизмеряешь скорость создания одного объекта и скорость выполнения теста? Это примерно 0.00001 процента.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: А что С++-калька Delphi BCBuilder?
От: a  
Дата: 14.05.02 19:56
Оценка:
dfasdf
Re: Неадекватность Судейства во втором тесте
От: a  
Дата: 14.05.02 19:56
Оценка:
dsfdsf
Re: А что С++-калька Delphi BCBuilder?
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.01.02 22:37
Оценка:
В скором времени на этом сайте появится продолжение данной статьи. В нем будут освещены: BCC 5.5, GCC и VC7. BCB нами не рассматривался, но можно предположить, что его результаты будет такими же как у BCC 5.5 (по крайней мере лучше они быть не должны). Пока продолжение доступно здесь: http://www.optim.ru/cs/2001/4/test2/test2.asp
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Некорректность тестов (Part 1)
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.11.01 15:33
Оценка:
> ...без них нельзя, причем НУ НИКАК НЕЛЬЗЯ в
> многопоточных приложениях...

Блин, а никто не знал! Проблема не в 10% (которые могут дать бокировки), а в том, что стандартный хип начинает дико тормозить (в разы) на втором (и далее) проходе теста.

Кстати, о IsMultiThreaded я не знал. Что же попробовал с ней... Действительно скорость выполнения Delphi-йской замедлилась приблизившись к скорости показанной VC, но! Но VC-шный тест-то, был как раз скомпилирован в single-thread-версии. Так что он все равно проиграл, а сравнение было совершенно корректным. Более того. Сегодняшнее тестирование доказало, что реализация хипа в Delphi превосходит реализацию хипа в W2k, так как Delphi-ёвый тест проходит, в multi-thread-версии повторные тесты без задержек.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Некорректность тестов (Part 1)
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.11.01 15:31
Оценка:
> ...переменная класса объявлена статически, тогда
> как в Делфи это указатель, меняем в С++ на
> динамическое создание и получаем абсолютно
> идентичные показатели

VC действительно зачем то лезет в стек, но это его личные проблемы (вернее разработчиков и продавцов). К тому же заявление "и получаем абсолютно идентичные показатели", мягко говоря не соответствует действительности. Я переделал тест и прогнал оба варианта по очереди несколько раз (на той же машине — AMD1400). Так вот скорость выполнения теста не изменилась! Так что наезд бессмысленный.

К тому же в inline-режиме VC стал бесспорным лидером, а в обычном победил не Дельфи, а C#. Просто сейчас на этом сайте есть ошибка. Думаю завтра исправят.

VC7 создал в точности такой же код вызова, но при этом, был быстрее (4.36 и в inline и не- режиме). Полностью его результаты мы опубликуем позже. Кстати, на одном из тестов (и не синтетическим как доступ к членам) он оказался значительно быстрее. Но всему свое время.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.