Соответствует ли действительности то, что компилятор 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... Вы рады?
- Функциональное программирование
<<<... | 26—17 | 16—7 | ...>>> Всего сообщений в теме: 346; страниц: 35; текущая страница: 34
№ 16 17-11-2001 00:50 | |
IMHO, лучший компилятор C++ - Intel. Builer - оптимальное соотношение между качеством компилятора и среды разработки. Но разницу между качеством кода Вы почувствуете лишь на критичных по времени задачах. Это могут быть задачи связанные с технической кибернетикой, обработка больших массивов данных. Однако в любом случае, критичные по времени участки кода надо писать на ассемблере, что и рекомендую всем, на каком бы языке Вы не писали. Правда на языке высокого уровня (на C++ или на Java) нужно писать если Вы хотите сделать переносимую программу. Вот тут, ассемблер уже не поможет.
№ 15 17-11-2001 00:38 | |
"...Техника в руках индейца превращяется в оружие" (любимое выражение
одного моего товарища). Так вот есть такое мнение (мое):
1) CB использует VCL, написанную на Object Pascal. В его C++ внесены
изменения (и далеко не только языковые) для того, чтобы с этой самой
VCL работать, что, по моему мнению, и увеличивает размер кода.
2) на C++ нужно УМЕТЬ писать (см. выше, хотя я и не особо то с C++,
Object Pascal как-то удобней, но есть товарищи - умеют и пишут), что-бы получить быстрый и компактный код.
3) У Borland C++ такой-же быстрый компилятор как и у VC++. Не стоит путать быстродействие VCL и MFC, с быстродействием кода. Тем более, что в 90% приложений никто не почувствует разницы между хорошо написанными приложениями на Delphi и VC++ (если, конечно не моделировать ядерный взрыв или что-то в этом роде).
4) С месяц назад я проводил эксперемент: компилировал программу на C
и программу на Pascal (Delphi), которая выполняла сложение,вычетание, умножение и деление двух вещественных чисел 100 млн. раз. Компиляцию производил с оптимизацией под 386, Pentium и Pentium Pro(только С-программа). Тестирование прводил на ПК с процессорами Pentium II, Pentium II Xeon, Pentium III, Pentium III Xeon. Результаты эксперимента можно выразить несколькими пунктами:
- программа, оптимизированная для i386, выполняется медленнее чем
остальные на всех типах процессоров (хотя и очень незначительно).
- на Pentium II оптимизация для Pentium Pro дала результат хуже чем
для Pentium (совсем чуть-чуть).
- на Pentium III оба варианта работали одинаково (тик в тик).
- оптимизация для Pentium Pro дала немного лучшие результаты на
Xeon'ах.
ВЫВОД: если Вы пишите не серверные приложения критичные по времени выполнения, то пользуйтесь любым из трех упомянутых выше компиляторов (кто какой больше любит). РАЗНИЦЫ ВИДНО НЕ БУДЕТ!!! А ЕСЛИ КТО ЕЕ И ВИДИТ, ТО ЭТО ОТ ОГРОМНОЙ ЛЮБВИ К СРЕДЕ РАЗРАБОТКИ, КОТОРОЙ ОН ПОЛЬЗУЕТСЯ!!!
№ 14 16-11-2001 23:43 | |
Re: "Дело в том, что компилятор Delphi/C++Builder на самом деле использует только основные оптимизационные алгоритмы, в тот время как VC++/GNU/IC++ давно используют более продвинутые алгоритмы оптимизации."
А ты проверь сначала... Я сравнивал (VC 6.0 vs Delphi 5.0) на небольшой проге постороения фракталов, Вообще разница во времени укладывается в погрешность измерения, но вот тебе реальные данные (время в миллисекундах, по два замера для разных начальных параметров):
-- VC -- Delphi --
210 211
212 211
2109 2098
2099 2100
11452 11380
11430 11391
Re: "Почитайте guide от Intel C++ Compiler, например."
Я тебе и не такое напишу :)
№ 13 16-11-2001 23:35 | |
Re: Вы отключали оптимизацию, неправда ли?
Re: Т.к. для таких пустых циклов вообще никакого машинного кода не дожно генерироваться
При отключении оптимизации код становится ровно таким, как в Builder'е без оптимизации (первый asm-код в примере).
Для циклов, где не используется переменная цикла, Дельфи гарантирует только выполнение этого цикла заданное кол-во раз, что в данном примере его оптимизатор и продемонстрировал, а оптимизатор Билдера не смог. Мое мнение, что это просто недоделка писателей оптимизатора лдя Билдера, а такой примитивный код, действительно, не является реальным показателем производительности программ написанных на Билдере, надо что-нибудь более "весомое", если ты только не собираешься писать эмуляцию старого доброго Delay(); :-)
№ 12 16-11-2001 22:22 | |
>С включенной оптимизацией любой компилятор C++ превосходит Delphi
Любой?? Не смущайте народ.
№ 11 16-11-2001 21:32 | |
Дуракам Guide не писан. С включенной оптимизацией любой компилятор C++ превосходит Delphi (исключая C++Builder). Дело в том, что компилятор Delphi/C++Builder на самом деле использует только основные оптимизационные алгоритмы, в тот время как VC++/GNU/IC++ давно используют более продвинутые алгоритмы оптимизации. Почитайте guide от Intel C++ Compiler, например.
№ 10 16-11-2001 21:13 | |
По моему мнению сравнивать качество кода на таком простом примере, как пустой цикл не корректно в принципе. Лучше взять какой-либо более сложный, но в то же время часто встречающийся алгоритм. Это может быть, например, цифровая бих-фильтрация или, скажем быстрое преобразование Фурье. И тогда, как мне кажется, C++ покажет всю свою мошь.
№ 9 16-11-2001 20:49 | |
Время компиляции это еще не все (хотя достает). Размер exe файла значительно больше: C++ Builder файл содержит в себе полную паскалевскую библиотеку и полную С++ библиотеку. В результате моя программа на Delphi занимала 600 Kb a ее перевод на C++ Builder 1.1 Mb (просто перевел строчка за строчкой).
№ 8 16-11-2001 19:27 | |
для того чтобы нормально влесть в отладчик в BCB требуется оставить
отладочные опции. Я как хакер со стажем сделал Release проекта после чего его дизассемблировал: вот что получилось
_TForm1_FormCreate proc near ; DATA XREF: .data:00403420
xor eax, eax
loc_4016BE: ; CODE XREF: _TForm1_FormCreate+8
inc eax
cmp eax, 1000000000
jl short loc_4016BE
retn
_TForm1_FormCreate endp
Это ничем Delphi не уступает.
№ 7 16-11-2001 19:10 | |
CBuilder 5 :
for (register int i = 0; i < 1000000000; i++);
register int i = 0;
do {
} while ( ++ i < 1000000000);
Проект = релиз (но дебаг инфо оставлено!)
Оптимизация = скорость
Оба цикла компилированы в последовательности :
xor eax, eax
inc eax
cmp eax, 0x3baca00
jl -0x08
(Вары на локале = Auto [сиречь, если register сниму - все равно регистровыми останутся. Но ежели поставлю = None есст. станут на стек])
<<<... | 26—17 | 16—7 | ...>>> Всего сообщений в теме: 346; страниц: 35; текущая страница: 34
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|