Соответствует ли действительности то, что компилятор Object Pascal в
Delphi лучше компилятора C++ в C++Builder? Для эксперимента я создал два
проекта на С++Builder и Delphi соответственно, и всего навсего в процедуре
обрабатывающей нажатие на кноку задал пустой цикл от 1 до 1 миллиарда:
В С++Builder соответсвующая функция выглядела сл. образом:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i = 0; i < 1000000000; i++);
}
а в Delphi соответствующая процедура выглядела так:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
for i:= 0 to 1000000000 do;
end;
И что же оказывается - Программа на Delphi выполняется в 5 раза быстрее(4
сек., а на С++Builder - 20 cек.)! ??
Тогда я решил выяснить в чём разница в конечном коде, генерируемом
компиляторами C++Builder и Delphi. Для этого я просто установил точки
останова(breakpoint) напротив циклов и во время выполнения заглянул в
Debug Windows/CPU и что оказалось:
код сгенерированный компилятором С++Builder, соответсвующий пустому циклу
в ассемблерном представлении выглядит сл. образом:
xor edx, edx
mov [ebp-0x34], edx
inc dword ptr [ebp-0x34]
mov ecx, [ebp-0x34]
cmp ecx, 0x3b9aca00
jl -0x0e
А у Delphi получился такой код:
mov edx, $3b9aca00
dec edx
jnz TForm1.Button1Click + $5
Т.О. отсюда уже понятны причины почему программа на Delphi быстрее
выполняется. Помимо того что бросается в глаза большее количество команд
видно ещё принципиальное отличие - в коде первой программы в качестве
переменной-счётчика используется ячейка памяти, а компилятор Delphi
сгенерировал код в котором используется регистр процессора в качестве
счётчика. Хорошо, можно и устранить последнее отличее сл. образом:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (register int i = 0; i < 1000000000; i++);
}, т.е. перед переменной-счётчиком i указали спецификатор register,
предварительно в настройках компилятора разрешив использование Register
Variables(Project/Options/Advanced Compiler/Register Variables).
Действительно тогда код сгенерированный компилятором С++Builder изменится
к виду:
mov eax, 0x3b9aca00
dec eax
test eax, eax
jnle -0x05
Как видим теперь уже почти не отличается от кода сгенерированного
компилятором Delphi! За исключением одной лишней команды - test eax,
eax(зачем она нужна??) и команды jnle вместо jnz. Вот за счёт этой лишней
команды test eax, eax, кот. выполняется в цикле и увеличивается время
выполнения (на 15 сек. становится дольше). Так что же это?! Низкое
качество генерируемого кода компилятором C++Builder в сравнении с
компилятором Delphi?? Специалисты! Помогите! Проясните ситуацию. Какой же
компилятор лучше - C++Builder или компилятор Delphi?? Или возможно как-то
добиться той же эффективности кода, настроив как-то компилятор С++ в
С++Builder? Очень благодарен за ответы с пояснением!
PS Ещё заметил такой прикол, что если в С++Builder вместо просто цикла от
1 до миллиарда использовать 2 равносильных цикла, т.е. один вложенный в
другой: внешний от 1 до миллиона, а внутренний от 1 до тысячи, вот тогда
как ни парадоксально скорость выполнения 2х циклов быстрее в 5 раз чем
просто одного от 1 до миллиарда! Т.Е. вариант:
for (int i = 0; i < 1000000000; i++);
много медленее, чем вариант:
for(int i = 1; i < 1000000; i++)
for(int j = 1; j < 1000; j++);
!!?? Получается что если нам надо выполнить какие-то действия в
программе миллиард раз, нужно это сделать не в одном цикле, а задать
внешний цикл от 1 до миллиона и внутренний от 1 до тысячи, например, и в
теле внутреннего описать все действия!!??
Максим
Всего в теме 346 сообщений
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Вот и вышла Delphi 7... Вы рады?
- Функциональное программирование
№ 316 28-08-2007 03:53 | |
Тут в соседней ветке уже проскакивала ссылка на статью http://stfw.ru/page.php?id=5112
Цитата оттуда:
Тем не менее, именно те свойства языка C, которые делают его использование источником дыр в больших программах, привели к его популярности среди незрелых киддисов от программирования, рассматривающих его как игру, соревнование, арену демонстрации собственного «интеллекта». Важно понимать, что подобные явления не являются специфичными для программирования: в филологии и детской психологии хорошо известно аналогичное явление «детского фольклора» (страшилки и т.п.), демонстрирующее устойчивость на протяжении многих десятилетий. Таким образом, можно говорить о стихийном распространении своеобразной мифологии вокруг языка C и его производных, коренящейся в естественном недостатке знаний и опыта, а также в особенностях психики юных программеров - желания самоутвердиться среди сверстников («настоящие программеры пишут на C») и т.д.
<...>
Стихийное распространение в среде юных партизан от программирования порочной мифологии, возникшей вокруг языков C/C++, имеет резоны в примитивных архетипах подростковой психологии.
Лучше обо всём этом семействе С/С++ не скажешь :)
Ещё хорошая цитата оттуда:
Известны 10 преимуществ Паскаля перед Си:) Я приведу только одно, но самое важное:
На Си Вы можете написать:
Код:
for(;P("\n").R-;P("\ "))for(e=3DC;e-;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2);
На Паскале Вы НЕ МОЖЕТЕ такого написать.
№ 315 28-08-2007 03:30 | |
Ответ на »сообщение 312« (Alexander)
___________________________
Лично я считаю что на языках семейства Си писать легче.
Писать - легче. Читать - сложнее.
Я всегда впадаю в легкий ступор, когда надо быстро разобраться в конструкциях вида
int i=5;
i = ++i + ++i;
№ 314 28-08-2007 03:27 | |
Ответ на »сообщение 309« (Alexander)
___________________________
В чем причина популярности Паскаля?
Сколько не смотрел разных оценок популярности языков, семейство C/C++ всегда обходило Delphi (даже если добавить FreePascal).
№ 313 28-08-2007 03:23 | |
Ответ на »сообщение 310« (Geo)
___________________________
Естественно, если я вдруг ни с того ни с сего задумаю создать, например, 3D-шутер, то не буду этого делать на Delphi :-D
Ну... 3D-шутеров на Delphi я тоже не видел, но вообще игры пишут. И вполне успешные. Та же серия Age of Wonders, например.
№ 312 28-08-2007 03:21 | |
Ответ на »сообщение 311« (Cepгей Poщин)
___________________________
Один из моих аргументов о которых я не сказал:
удобность синтаксиса C++. Лично я считаю что
на языках семейства Си писать легче. В частности
в школе и в универе меня так и не смогли научить Паскалю, что
ни как не мешает мне писать проги в C++Buider и Microsoft Visual C++
№ 311 28-08-2007 02:51 | |
Ответ на »сообщение 309« (Alexander)
___________________________
преимуществ больше у Си (перечислять не буду)...
Прошу не давать голословных...
Аргументируйте свой ответ... Т.е. сами аргументировать не хотите, а нас заставляете...
Если быть кратким, то в разных обсуждениях высказывалась мысль: и в Pascal и в C можно прострелить себе ногу, но в C это сделать гораздо проще, отсюда в Pascal ниже порог вхождения. Т.е. что-то напрограммировать ни чего не зная о программировании на Pascal можно, а на C — нет.
№ 310 28-08-2007 02:49 | |
Ответ на »сообщение 309« (Alexander)
___________________________
С одной стороны, эффективность компилятора Delphi заметно выросла (если сравнивать с тем же Turbo Pascal). С другой стороны, на современном этапе развития компьютерной техники и программного обеспечения при создании больших систем уменьшение размеров кода и повышение быстродействия не являются критичными. На первое место выходит скорость и удобство разработки. Поэтому, Delphi теснит конкурентов. Легко читаемые тексты (псевдопаскалевский язык используется даже для описания работы алгоритмов, так как он прост и понятен), удобная среда разработки (я их видел, конечно, далеко не все, но IDE Delphi -- лучшее, что я видел; Microsoft отдыхает в стороонке) и ориентация на разработку приложений баз данных (наиболее популярное направление разработки больших систем сейчас).
Естественно, если я вдруг ни с того ни с сего задумаю создать, например, 3D-шутер, то не буду этого делать на Delphi :-D
№ 309 28-08-2007 01:56 | |
Здравствуйте уважаемые Господа!
Обращаюсь я к Вам с не совсем традиционным
вопросом. Некоторым он может показаться
наивным, некоторым риторическим, некоторым
глупым, не хотите не отвечайте.
Я студент технического ВУЗа, моя специальность
связана напрямую с программированием. Собственно
его изучениям я занимаюсь почти с начальной школы.
Я всегда отдавал предпочтение языкам семейства Си,
мне кажется что, преимуществ больше у Си (перечислять не буду).
Многие этому удивляются, спрашиваю почему не Паскаль.
Внимание вопрос:
В чем причина популярности Паскаля? Почему
так много людей пишущих на Delphi?
Грубо говоря: что у него есть чего нет Си?
Прошу не давать голословных ответов вроде:
-Синтаксис паскаля легче.
-Люди привыкли к нему.
Аргументируйте свой ответ.
№ 308 16-08-2007 02:59 | |
Ответ на »сообщение 47 в теме №381 на БП« (vit)
___________________________
Не ерунда, а суровая правда жизни. Тестик с www.sql.ru - перебор всех возможных перестановок элементов массива:
Скачал я оттуда тестик. Об уровне тамошних тестеров красноречиво говорит код:
for m:=razmer downto 2 do
if b[m]>b[m-1] then
break;
if m=1 then
Break;
FPC уходит в бесконечный цикл. В Delphi случайно (!) работает как задумывалось.
После того, как переписал как положено, в FPC с включенными оптимизациями, время действительно получилось в два раза больше, чем в Delphi. Глянул дизассемблер, отключил range checking, overflow checking и т.п. И получил конечный результат:
Delphi 7:
Count: 39916800
Time: 2500(ms)
FPC 2.1.4:
Count: 39916800
Time: 3281(ms)
Разница около 30%. Если учесть, что тут сравнивается именно производительность кода (все данные в кэше), то это незначительно. В реальных приложениях, с обменом данными с памятью, разница будет почти незаметна, что и показывают другие тесты.
№ 307 09-07-2007 14:50 | |
Ответ на »сообщение 306« (Марина)
___________________________
Установка директивы inline дала обратный эффект.
А оно заинлайнилось? В CPU view что видно? У меня D7, сам проверить не могу.
А вообще хорошо что перегруженные операторы тормозят - не будут перегружать где попало и что попало.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|