Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  17:08[Войти] | [Зарегистрироваться]
Обсуждение темы:
Сравнение компиляторов

Соответствует ли действительности то, что компилятор 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, например."
    Я тебе и не такое напишу :)
     HG


    № 13   16-11-2001 23:35 Ответить на это сообщение Ответить на это сообщение с цитированием
    Re: Вы отключали оптимизацию, неправда ли?
    Re: Т.к. для таких пустых циклов вообще никакого машинного кода не дожно генерироваться

    При отключении оптимизации код становится ровно таким, как в Builder'е без оптимизации (первый asm-код в примере).
    Для циклов, где не используется переменная цикла, Дельфи гарантирует только выполнение этого цикла заданное кол-во раз, что в данном примере его оптимизатор и продемонстрировал, а оптимизатор Билдера не смог. Мое мнение, что это просто недоделка писателей оптимизатора лдя Билдера, а такой примитивный код, действительно, не является реальным показателем производительности программ написанных на Билдере, надо что-нибудь более "весомое", если ты только не собираешься писать эмуляцию старого доброго Delay(); :-)
     HG


    № 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


    Добавить свое сообщение

    Отслеживать это обсуждение

    Дополнительная навигация:
    Количество сообщений на странице

    Порядок сортировки сообщений
    Новое сообщение вверху списка (сетевая хронология)
    Первое сообщение вверху списка (обычная хронология)

    Перейти на конкретную страницу по номеру
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования