Соответствует ли действительности то, что компилятор 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... Вы рады?
- Функциональное программирование
<<<... | 16—7 | 6—1 Всего сообщений в теме: 346; страниц: 35; текущая страница: 35
№ 6 16-11-2001 16:14 | |
Рустам
Это проблема именно языка С/С++, которая наблюдается с момента их появления, а не С++Билдера.
Некоторое ускорение дает прекомпилция заголовочных файлов (headers), но стоит изменить строчку в них и эффект теряется.
Поэтому стиль работы программистов на С++ и Дельфи разный: С++ программист не станет проверять лексические и синтаксические ошибки путем компиляции после каждого небольшого изменения, а обрабатывает их большИми порциями.
№ 5 16-11-2001 13:14 | |
Насчет времени компиляции проектов в билдере при изменении одной строчки кода - я тут буквально на днях слышал, что если специально что-то хитрое там не настроить, каждый раз перекомпилируется ВСЯ VCL! Мое мнение - Дельфи умнее.
№ 4 16-11-2001 12:14 | |
Привет всем!
В фирме, где я работаю, программисты разрабатываю приложения на Дельфи и на С Билдере. У тех кто имел несчастье иметь дело с Билдером (при всем моем уважении к С++) появляются проблемы при компиляции довольно большого проекта. В нем очень много юнитов. К тому же были нарушены даты изменения файлов (эксперементировали с системным временем) и в результате проект компилируется (не поверите) 30-40 минут!!!. Это только при добавлении ожной строчки кода... А в Делфьи даже если все DCU файлы стереть и скомпилировать большой проект. Секунды... Судите сами. Тут не проблема языка C, тут проблема написания самого билдера, он же и паскалевских компилятор тоже понимает. Там борланд наворотил, в результате ерунда получилась. Если писать на С, то на голом С++, а если с использрванием VCL - мой вам совет - пишите на Дельфи!
№ 3 16-11-2001 11:40 | |
> Максим
Вы отключали оптимизацию, неправда ли?
Т.к. для таких пустых циклов вообще никакого машинного кода не дожно генерироваться.
№ 2 16-11-2001 11:36 | |
При всей моей любви к Delphi, ты выбрал неудачный объект для сравнения. Цикл for в Це кардинально отличается от цикла for в Delphi. Если сравнивать, то сравнивать такие конструкции:
for (int i=0; i<1000000000; i++) ;
и
i:=0;
while i<1000000000 do
inc (i);
Не проверял, но думаю, показатели не будут столь катострофичными.
А причина всего -- отсутствие в языке Це "простого" цикла for, подобный тому, что есть в Pascal'е.
Еще один немаловажный аспект: не исключено, что оптимизатор (в CBuilder) может различать простую конструкцию и генерировать соответствующий, облегченный код.
№ 1 16-11-2001 11:08 | |
Да забавно, я не берусь судить о корне проблеммы,
но хочу сказать что похожая ситуация и в MSVC++ :-)
Совсем не давно попробовал такую же конструкцию в дельфи
и вижал си с такими же почти результатами.
самый простой вывод, который приходит в голову -
компиляторы си не увлкаются оптимизацией без должного пинка
со стороны разработчика :)
<<<... | 16—7 | 6—1 Всего сообщений в теме: 346; страниц: 35; текущая страница: 35
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|