C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
CBuilder or VC++, Актуальность CBuilder
Orifiel
Отправлено: 21.01.2004, 15:46


Не зарегистрирован







Наверное подавляющее большинство согласится с мнением,
что CBuilder на голову превосходит практически все известные
на сегодня IDE под Винду. Почему все же считается хорошим тоном
програмить на конченом мелкософтовском VC с его мастдайной MFC?
С интересом готов рассмотреть ваши соображения на сей счет, коллеги.
maikl
Отправлено: 21.01.2004, 15:58


Станционный диспетчер

Группа: Участник
Сообщений: 135



Согласен, на моем курсе так же несколько студентов на VC программировали свою курсовую, в общем от этого они не были в восторге, очень жалели, ругались на эту среду программирования. Короче сказали что Builder и Delphi рулят. Ну а если посмотреть шире, то каждый использует то что ему больше нравится, и где он чего больше знает, кто то возможно боится или просто не хочет осваивать что то новое.
Nick
Отправлено: 21.01.2004, 18:03


Машинист паровоза

Группа: Участник
Сообщений: 247



VC не видел но говорят код получается оптимальней.
Ламер (редкий)
Отправлено: 06.02.2004, 12:56


Не зарегистрирован







я думаю, что Borland основательно обосрется со своим CBuilderX
и вскоре сделает чей-то типа CBuilder.NET с полной поддержкой VCL
Asher
Отправлено: 06.02.2004, 20:53


Мастер участка

Группа: Модератор
Сообщений: 550



Привет всем.

Я вот тут, в связи со всякими последнини событиями, типа BuilderX, решил посмотреть в сторону MS VC.
Попробовал написать микропримерчики и сравнить с Builder'ом.
VC получился определенно быстрей, особенно в плане создания/удаления объектов классов (читай скорость выделения/освобождения памяти) и в плане использования inline.
И виртуальные функции тормозней обычных всего на ~12%, а не на 23-25% как в Builder'e.
Визуальная часть, особенно после Builder'а, выглядит уж слишком убого, а может просто с непривычки.

P.S. Складывается впечатление, что я эти два неполных года программировавал не на том компиляторе sad.gif . хотя и в той среде. biggrin.gif

P.P.S. Может писать ядро на чистом С++ в VC или ICC, а потом ко всему этому хозяйству прикручивать оболочку на Builder'е? (это если ядро позволит wink.gif )
Георгий
Отправлено: 07.02.2004, 00:28


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Пьяный Жорик снова в форуме и пытается всех задавить своим снобизмом — QNX4.25 + WC10.6 это очень круто!!! а фильм "28 дней" ещё круче!!!
Asher
Отправлено: 09.02.2004, 13:39


Мастер участка

Группа: Модератор
Сообщений: 550



To Георгий:
Обоснуй. biggrin.gif biggrin.gif biggrin.gif
Zmey
Отправлено: 09.02.2004, 14:53


Ученик-кочегар

Группа: Участник
Сообщений: 15



Код, написанный на VC++, по всем параметрам превзойдет билдеровский.
Единственный и весьма существенный недостаток VC++ неудобный IDE и бедный набор компонентов, что сильно влияет на скорость разработки.
Однако, попробуйте на Билдере написать простенький драйвер .....
Кроме того, писать код на VC++, это на 90 % работать с WIN32 API, что делает програмиста на уровень проффесиональнее, так как необходимо хорошо понимать архитектуру ОС, ее особенности и работу. В Билдере же все нюансы работы с ОС скрыты, поэтому многие, пишущие исключительно на нем ВАЩЕ не понимают как и что работает ....
Я использую Билдер исключительно для разработки прог под СУБД — быстро и просто.
Все остальное — VC++
Георгий
Отправлено: 10.02.2004, 00:22


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Zmey
очень точная характеристика! Даже придраться не к чему.

Asher
Ща трезвый... Будет трудно обосновать...

Ладно, начнём обоснование smile.gif

фильм 28 дней — давно такого прикольного не видел: на фоне а ля "Resedent Evil" разворачивается действие по сути напоминающее "Бойцовский клуб", но не столь бессмысленное. Прошлись по многим особенностям нынешнего общества и это на фоне столь сильного, кровавого и жестокого действия.

QNX4.25 + WC10.6:
к watcom компиляторам всегда питал слабость — некоторые полюбившиеся мне игры были скомпилированы на нём (например UFO1), также потрясающие возможности по оптимизации кода — современные компиляторы не сильно обогнали старичка (1996, кажется, год выпуска WC10.6).
QUOTE
И виртуальные функции тормозней обычных всего на ~12%, а не на 23-25% как в Builder'e
откуда такие монстрообразные цифры???
физически виртуальные функции реализованы, как вызов по указателю(по адресу, записанному в поле структуры) и подобгный вызов всего лишь на нескольно тактов медленнее обычного (по прямому адресу) т.е. если вызов функции ~10 тактов, то на вычисление её адреса уйдёт ещё 2-3 такта (при условии, что данные лежат в кэше) т.е. +20-30%; return из функции займёт ещё ~5 тактов, и это при пустом теле функции (чего в реальной жизни не бывает) т.е. в худшем случае будет только 13-20% проигрыша во времени работы, а в реальной жизни и того меньше — если тело функции выполняется за 100 тактов, то накладные расходы на вызов по указателю будут нивелированы и составят всего лишь 2-3%.

QNX — просто порадовала — столь лаконичная и красивая идея, да и вдобавок качественно реализованная!

существует эффективная графическая оболочка для QNX4.xx — photon1.xx
и проблема эффективности компилятора в ней решена очень просто — средства разработки для photon генерируют си код который компилится стандартным компилятором (моим любимым wc). вдобавок программист может работать на 3-х уровнях абстракций:
1 — очень похоже на bcb — шмякаем элементы GUI на формы, связываем менюшки, устанавливаем обработчки. Для создания простенького отображения чего-нибудь никаких усилий не надо.
2 — без использования Application Builder`а (именно о нём шла речь в первом пункте) — создаём в програмном коде все объекты, устанавливаем обработчики и вызываем функцию PhMainLoop (название пишу по памяти, могу ошибиться), которая сама вызывает необходимые обработчики. аналоги под MS не придумывается...
3 — почти 2, но Receive теперь делаем ручками smile.gif соответственно пользовательским интерфейсом распоряжаться тоже нам. Это очень сильно напоминает написание программ на си под win32 ,без использования RAD.

НО, в отличии от MS + ( bcb || vc ) это всё без потери производительности.

удалось убедить, что QNX4+WC это круто? smile.gif
Asher
Отправлено: 10.02.2004, 10:10


Мастер участка

Группа: Модератор
Сообщений: 550



To Георгий: Убедил biggrin.gif Я в принципе и не сомневался wink.gif
По поводу полученных мной процентов:
пишем простенький пример
CODE

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long Var, Count;
struct B {
      void f();
      virtual void vf();
};
struct D : B {
      void vf();  // замещаем B::vf
};

void f1(B* ptr)
{
ptr->f();
}
void f2(B* ptr)
{
ptr->vf();
}

int main(int argc,char** argv)
{
if (argc>1) Count=atol(argv[1]);
clock_t c1,c2;
D d;
{
 c1=clock();
 for (long i=0; i<Count; i++)
     for (long j=0; j<1000000; j++)
         f1(&d);
 c2=clock();
 printf("f1(): %ld mlns calls per %.1f sec\n",Count,double(c2-c1)/CLK_TCK);
}
{
 c1=clock();
 for (long i=0; i<Count; i++)
     for (long j=0; j<1000000; j++)
         f2(&d);
 c2=clock();
 printf("f2(): %ld mlns calls per %.1f sec\n",Count,double(c2-c1)/CLK_TCK);
}
getchar();//
}
void B::f()  { Var++; }
void B::vf() { }
void D::vf() { Var++; }

и cмотрим результаты. Написанно для командной строки, параметром — количество миллионов прогонов.
Мои результаты (для 500 mlns)
AXP 1800+
BCppB_5 BCppB_6 MSVCpp_6 MSVCpp_7
----------------------------------------------------------------------------
func 4.9 5.2 2.9 2.9
virtual 6.4 6.2 4.0 4.0

P3 800
BCppB_5 BCppB_6 MSVCpp_6 MSVCpp_7
----------------------------------------------------------------------------
func 11.2 11.4 6.0 6.0
virtual 13.2 13.5 6.1 6.1

Celeron — 1700
BCppB_5 BCppB_6 MSVCpp_6 MSVCpp_7
----------------------------------------------------------------------------
func 6.7 6.7 4.0 4.0
virtual 7.9 7.9 4.3 4.3

взяв калькулятор нетрудно подсчитать накладные расходы на вызов virtual
P.S. Вложенные функции сделанны на всякий случай, чтобы компилятор случайно не прооптимизировал wink.gif
Gedeon
Отправлено: 10.02.2004, 11:11


Ветеран

Группа: Модератор
Сообщений: 1742



Не пойму, почему все до сих пор спорят Builder vs VC++ ведь появился C#, в котром и с интерфейсом все в порядке и со скоростью, кроме того и мой опыт работы, и просмотр тех же требований для современных программистов (в 80% уже хотят С#) показывает, что все движется именно в эту сторону. VC++ — с его скоростью это конечно хорошо, но с современными компами этого заметить практически невозможно, с тех пор как программирование из исскуства превратилось в производство скорость разработки приложений в большинстве случаев является определяющей, кроме того главным для программиста является то, что написать программу мало, ее нужно продать и современной скоростью разработки приложений, их разнообразием и количетвом сделайте некрасивый интерфейс даже для очень быстрой и хрошей программы — хрен ее кто купит. Т.К. способные это оценить деньги в основном платить не хотят (за редким исключением). В конечном итоге плательщиком и заказчиком остается юзер, а он некрасивого не любит.
Asher
Отправлено: 19.02.2004, 18:03


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Я не совсем в курсе, но C# вроде работает только через FrameWork?

P.S. Не у всех заказчиков современные компы свободно бегающие под XP или 2000. В промышленности у многих стоит железо гораздо слабее и дополнительная прослойка им — нож в ... Тут их с DOS , только тсс, Георгию не говори biggrin.gif удалось сдвинуть на NT, а предлагать им теперь машины менять, где годами все работало — не поймут.
Это не потребительский рынок, где машина нужна помощней для игр, а все остальное заодно тоже быстро бегает.
P.P.S. Мы зачастую заложники сопровождения старых систем sad.gif
Георгий
Отправлено: 20.02.2004, 00:38


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



навскидку 3 категории придумал:
1. хорошо обслуживаемые высокопроизводительные системы (серверы и т.п.)
2. плохо обслуживаемые высокопроизводительные системы (домашние и офисные ПК)
3. плохо обслуживаемые низкопроизводительные системы (промышленные компьютеры, банкоматы и т.п.)

.net да и java смело используют только для 2й категории, а на остальных не верят этим "платформам" (пока не прошли они проверку временем), да и не всегда производительности даже си хватает...

такчто массы перейдут на C#, потом ещё куда-нибудь, а 1 и 3 (т.н. системные программисты) в лучшем случае только лет через 5-7 переползут на C++, да и то не для всех аппаратных платформ сейчас есть С++ компиляторы smile.gif

PS. понимаю, конечно, что это форум для группы №2 но все начинают с малого smile.gif

PPS. и куда тут C#, на ещё в реальном времени, присобачить? хорошо будет, если время отклика будет порядка секунд smile.gif
QUOTE
Новую плату формата PC/104 представила компания "Индустриальные компьютерные
системы" (ИКОС). Это процессорная плата ICOP-6072, продолжающая линейку устройств
PC/104 на базе процессорного модуля SoC Vortex86. PC/104 сегодня является одним
из основных стандартов для встраиваемых систем. Устройства, разработанные в этом
стандарте, отличаются низким потреблением энергии, малыми размерами, отсутствием
пассивной объединительной шины, широким температурным диапазоном. Кроме того,
широкий выбор представленных сегодня периферийных плат PC/104 открывает перед
разработчиками практически неограниченные возможности по модернизации и расширению
функциональных возможностей своих систем.

Кроме особенностей, присущих всем устройствам этого стандарта, плата ICOP-6072
имеет ряд особенностей, обусловленных наличием System-On-Chip Vortex86. Этот
процессорный модуль имеет интегрированные устройства, обеспечивающие поддержку
CRT/LCD, UDMA IDE, FDD и модулей ввода-вывода. Кроме того, Vortex86 имеет очень
низкий уровень потребления энергии и может работать без дополнительного охлаждения.

Плата ICOP-6072 работает в расширенном температурном диапазоне от -20 до +70°C.
Она может широко использоваться в торговых и информационных терминалах, в системах
удаленного контроля, промышленных компьютерных системах и для работы множества
критически важных приложений.
(фото http://www.icn.ru/i/a.nsf/u/icop-6072)

Сегодня эта плата доступна для заказа и предлагается по цене 227$. С полным техническим
описанием платы можно ознакомиться на сайте ИКОС www.ipc2U.ru в разделе "Процессорные
платы PC/104". В этом же разделе находятся описания всех моделей линейки одноплатных
компьютеров PC/104, поставляемых компанией ИКОС.

Ниже перечислены основные характеристики новой платы ICOP-6072:
- Форм-фактор PC/104
- Встроенный процессорный модуль System-On-Chip Vortex86 133МГц
- Установленная память 32Мб SDRAM
- Встроенный в System-On-Chip видеоконтроллер AGP 2x для CRT/LCD дисплеев. Использует
до 16Мб системной памяти.
- Порты ввода/вывода:
- 1 x RS-232/485, 1 x RS-232
- 1 x GPIO 12бит
- 1 параллельный порт
- 1 х FDD
- 2 x USB 1.1
- Часы реального времени с литиевой батареей
- Программируемый сторожевой таймер
- Напряжение питания: +5В@0,7А
- Размеры: 90х96мм
- Диапазон рабочих температур: -20...+70°C

утром читаешь, что сам же написал и думаешь — какой же это бред

Отредактировано Георгий — 20/02/2004, 09:34
Gedeon
Отправлено: 20.02.2004, 15:39


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Георгий @ 20/02/2004, 01:40)
3. плохо обслуживаемые низкопроизводительные системы (промышленные компьютеры, банкоматы и т.п.)

Позвольте трохи не согласиться по поводу банкоматов это если старые Diebold взять то да там еще даже больше полуоси ничего не приживается, но например Siemens WincorNixdorf 2000 и выше конфигурация — Intel PIII 800 MHz, RAM 128 MB, как бы вроде тоже ничего тут WinNT 4.0 SP6, то чего я там писал на билдере прекрасно работало, слабое место канал связи, но и то до появления радиоканала. smile.gif А сейчас есть новые картометы, ICC по моему, так там уже стоят четвертые пни, вот только вопрос нахрена?
QUOTE

Не у всех заказчиков современные компы свободно бегающие под XP или 2000. В промышленности у многих стоит железо гораздо слабее и дополнительная прослойка им — нож в ...

Тут я не спорю, такие люди умеют оценить, что для них сделал программист и на таких системах как правило программирование еще остается искусством, но как ни жаль эти заказчики как правило не могут заплатить как того бы хотелось.
Георгий
Отправлено: 20.02.2004, 23:33


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



может действительно я зря кипячусь типа — с++ рулит, а остальное для остальных.

в ближайшем будущем контора, где работаю, будет использовать или спарки 500 мегагерцовые или via c3 400MHz, конечно о реальном времени (по крайней мере в плане гарантированного времени отклика) на C# и прочих черезчур объектных системах и речи быть не может, но использование даже этого железа для торговый терминалов и прочих систем, которые взаиможействуют с человеком и ждут его запросов, вполне возможно, более того, C# даже предпочтительнее. Ведь глядя на программистов на чистом си я ужасаюсь — пишут нормальные программы в плане функциональности и скорости, но с нулевыми показателями сопровождаемости и модернизируемости...

ладно — убедили ещё годик, другой поработаю как на промышленные АСУ (платят всётаки неплохо), а потом пойду оболочки для БД клепать.
Георгий
Отправлено: 22.02.2004, 15:59


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



вот я и созрел для аргументированного сравнения WC и BCB:
програмка, предложенная Asher, была чуть-чуть изменена и стала вот такой:
CODE


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long Var, Count;

class B
       {
public:
       void f();
       virtual void vf();
       };
class D :public B
       {
public:
       void vf();
       };

void f1(B* ptr)
       {
       ptr->f();
       }
       
void f2(B* ptr)
       {
       ptr->vf();
       }

int main(int argc,char** argv)
       {
       if (argc>1) Count=atol(argv[1]);
       else Count=500;
       clock_t c1,c2;
       D d;
       {
               c1=clock();
               for (long i=0; i<Count; i++)
                       for (long j=0; j<1000000; j++)
                               f1(&d);
               c2=clock();
               printf("f1(): %ld mlns calls per %.1f sec\n",Count,double(c2-c1)/CLK_TCK);
       }
       {
               c1=clock();
               for (long i=0; i<Count; i++)
                       for (long j=0; j<1000000; j++)
                               f2(&d);
               c2=clock();
               printf("f2(): %ld mlns calls per %.1f sec\n",Count,double(c2-c1)/CLK_TCK);
       }
       getchar();//
       return 0;
       }
       
void B::f()  { Var++; }
void B::vf() { }
void D::vf() { Var++; }

на моём Athlon XP (thorobred-B 1900MHz=200x9.5) BCB с оптимизацией на скорость и использованием stdcall (почему то он глючит при указании register, поэтому пришлось использовать stdcall)
дал такие времена:

f1(): 500 mlns calls per 3.5 sec
f2(): 500 mlns calls per 4.6 sec

WC 11.0 под MS windows показал вот такие результаты:
f1(): 500 mlns calls per 0.6 sec
f2(): 500 mlns calls per 1.9 sec

WC 10.6 под QNX4.25:
f1(): 500 mlns calls per 0.5 sec
f2(): 500 mlns calls per 1.8 sec

как видите старичёк WC действительно силён.

компилировалось вот так:
CODE
wpp386 test.cpp -w4 -e25 -s -zp4 -zq -otexan -ob -ol -ol+ -om -oc -or -oe20 -fp6 -fpc -6r -bt=nt -mf


дизассемблирование кода произведённого WC для MS:
CODE
Module: D:\temp\test.cpp
GROUP: 'DGROUP' CONST,CONST2,_DATA,_BSS

Segment: _TEXT PARA USE32 000001A7 bytes
0000                          void near f1( B near * ):
0000    FF 05 00 00 00 00         inc       dword ptr long near Var
0006    C3                        ret      
0007    8D 80 00 00 00 00         lea       eax,[eax]
000D    8D 52 00                  lea       edx,[edx]

Routine Size: 16 bytes,    Routine Base: _TEXT + 0000

0010                          void near f2( B near * ):
0010    52                        push      edx
0011    8B 10                     mov       edx,[eax]
0013    FF 12                     call      dword ptr [edx]
0015    5A                        pop       edx
0016    C3                        ret      
0017    8D 80 00 00 00 00         lea       eax,[eax]
001D    8D 52 00                  lea       edx,[edx]

Routine Size: 16 bytes,    Routine Base: _TEXT + 0010

0020                          main_:
0020    53                        push      ebx
0021    51                        push      ecx
0022    56                        push      esi
0023    57                        push      edi
0024    55                        push      ebp
0025    83 EC 04                  sub       esp,0x00000004
0028    8B 35 00 00 00 00         mov       esi,long near Var
002E    83 F8 01                  cmp       eax,0x00000001
0031    0F 8F 19 01 00 00         jg        L$8
0037    C7 05 00 00 00 00 F4 01 00 00
                                 mov       dword ptr long near Count,0x000001f4
0041                          L$1:
0041    B9 04 00 00 00            mov       ecx,offset void (near * const near __vftbl[])()+0x4
0046    31 DB                     xor       ebx,ebx
0048    89 0C 24                  mov       [esp],ecx
004B    E8 00 00 00 00            call      clock_
0050    8B 2D 00 00 00 00         mov       ebp,long near Count
0056    89 C7                     mov       edi,eax
0058    85 ED                     test      ebp,ebp
005A    7E 21                     jle       L$4
005C                          L$2:
005C    8B 35 00 00 00 00         mov       esi,long near Var
0062    31 C0                     xor       eax,eax
0064                          L$3:
0064    40                        inc       eax
0065    46                        inc       esi
0066    3D 40 42 0F 00            cmp       eax,0x000f4240
006B    7C F7                     jl        L$3
006D    A1 00 00 00 00            mov       eax,long near Count
0072    43                        inc       ebx
0073    89 35 00 00 00 00         mov       long near Var,esi
0079    39 C3                     cmp       ebx,eax
007B    7C DF                     jl        L$2
007D                          L$4:
007D    E8 00 00 00 00            call      clock_
0082    BB FC A9 F1 D2            mov       ebx,0xd2f1a9fc
0087    29 F8                     sub       eax,edi
0089    B9 4D 62 50 3F            mov       ecx,0x3f50624d
008E    E8 00 00 00 00            call      __U4FD
0093    E8 00 00 00 00            call      __FDM
0098    52                        push      edx
0099    50                        push      eax
009A    8B 15 00 00 00 00         mov       edx,long near Count
00A0    52                        push      edx
00A1    68 00 00 00 00            push      offset L$10
00A6    E8 00 00 00 00            call      printf_
00AB    83 C4 10                  add       esp,0x00000010
00AE    31 DB                     xor       ebx,ebx
00B0    E8 00 00 00 00            call      clock_
00B5    8B 0D 00 00 00 00         mov       ecx,long near Count
00BB    89 C7                     mov       edi,eax
00BD    85 C9                     test      ecx,ecx
00BF    7E 1D                     jle       L$7
00C1                          L$5:
00C1    31 D2                     xor       edx,edx
00C3                          L$6:
00C3    8B 0C 24                  mov       ecx,[esp]
00C6    89 E0                     mov       eax,esp
00C8    42                        inc       edx
00C9    FF 11                     call      dword ptr [ecx]
00CB    81 FA 40 42 0F 00         cmp       edx,0x000f4240
00D1    7C F0                     jl        L$6
00D3    8B 2D 00 00 00 00         mov       ebp,long near Count
00D9    43                        inc       ebx
00DA    39 EB                     cmp       ebx,ebp
00DC    7C E3                     jl        L$5
00DE                          L$7:
00DE    E8 00 00 00 00            call      clock_
00E3    BB FC A9 F1 D2            mov       ebx,0xd2f1a9fc
00E8    29 F8                     sub       eax,edi
00EA    B9 4D 62 50 3F            mov       ecx,0x3f50624d
00EF    E8 00 00 00 00            call      __U4FD
00F4    E8 00 00 00 00            call      __FDM
00F9    52                        push      edx
00FA    50                        push      eax
00FB    A1 00 00 00 00            mov       eax,long near Count
0100    50                        push      eax
0101    68 23 00 00 00            push      offset L$11
0106    E8 00 00 00 00            call      printf_
010B    8B 15 04 00 00 00         mov       edx,___iob+0x4
0111    83 C4 10                  add       esp,0x00000010
0114    85 D2                     test      edx,edx
0116    7E 4A                     jle       L$9
0118    A1 00 00 00 00            mov       eax,___iob
011D    31 D2                     xor       edx,edx
011F    8A 10                     mov       dl,[eax]
0121    83 EA 0D                  sub       edx,0x0000000d
0124    81 FA FD 00 00 00         cmp       edx,0x000000fd
012A    76 36                     jbe       L$9
012C    8B 0D 04 00 00 00         mov       ecx,___iob+0x4
0132    40                        inc       eax
0133    49                        dec       ecx
0134    A3 00 00 00 00            mov       ___iob,eax
0139    89 0D 04 00 00 00         mov       ___iob+0x4,ecx
013F    8B 35 00 00 00 00         mov       esi,long near Var
0145    31 C0                     xor       eax,eax
0147    83 C4 04                  add       esp,0x00000004
014A    5D                        pop       ebp
014B    5F                        pop       edi
014C    5E                        pop       esi
014D    59                        pop       ecx
014E    5B                        pop       ebx
014F    C3                        ret      
0150                          L$8:
0150    8B 42 04                  mov       eax,0x4[edx]
0153    E8 00 00 00 00            call      atol_
0158    A3 00 00 00 00            mov       long near Count,eax
015D    E9 DF FE FF FF            jmp       L$1
0162                          L$9:
0162    B8 00 00 00 00            mov       eax,offset ___iob
0167    E8 00 00 00 00            call      fgetc_
016C    8B 35 00 00 00 00         mov       esi,long near Var
0172    31 C0                     xor       eax,eax
0174    83 C4 04                  add       esp,0x00000004
0177    5D                        pop       ebp
0178    5F                        pop       edi
0179    5E                        pop       esi
017A    59                        pop       ecx
017B    5B                        pop       ebx
017C    C3                        ret      
017D    8D 40 00                  lea       eax,[eax]

Routine Size: 352 bytes,    Routine Base: _TEXT + 0020

0180                          void near B::f():
0180    FF 05 00 00 00 00         inc       dword ptr long near Var
0186    C3                        ret      
0187    8D 80 00 00 00 00         lea       eax,[eax]
018D    8D 52 00                  lea       edx,[edx]

Routine Size: 16 bytes,    Routine Base: _TEXT + 0180

0190                          void near B::vf():
0190    C3                        ret      
0191    8D 80 00 00 00 00         lea       eax,[eax]
0197    8D 92 00 00 00 00         lea       edx,[edx]
019D    8D 40 00                  lea       eax,[eax]

Routine Size: 16 bytes,    Routine Base: _TEXT + 0190

01A0                          void near D::vf():
01A0    FF 05 00 00 00 00         inc       dword ptr long near Var
01A6    C3                        ret      

Routine Size: 7 bytes,    Routine Base: _TEXT + 01A0

No disassembly errors

Segment: CONST BYTE USE32 00000046 bytes
0000                          L$10:
0000    66 31 28 29 3A 20 25 6C 64 20 6D 6C 6E 73 20 63 f1(): %ld mlns c
0010    61 6C 6C 73 20 70 65 72 20 25 2E 31 66 20 73 65 alls per %.1f se
0020    63 0A 00                                        c..
0023                          L$11:
0023    66 32 28 29 3A 20 25 6C 64 20 6D 6C 6E 73 20 63 f2(): %ld mlns c
0033    61 6C 6C 73 20 70 65 72 20 25 2E 31 66 20 73 65 alls per %.1f se
0043    63 0A 00                                        c..



Segment: _BSS DWORD USE32 00000008 bytes
0000                          long near Var:
0004                          long near Count:

BSS Size: 8 bytes

Comdat: void (near * const near __vftbl[])() SEGMENT ANY 'DGROUP:CONST2' 00000008 bytes
0000                          void (near * const near __vftbl[])():
0000    00 00 00 00                                     ....
0004    00 00 00 00                                     DD void near D::vf()



как видите WC срезал углы и код
CODE
c1=clock();
for (long i=0; i<Count; i++)
for (long j=0; j<1000000; j++) f1(&d);
c2=clock();

был реализован без единого вызова функций biggrin.gif (см адреса 4B-7B) и работал с памятью только во внешнем цикле. Во внутреннем только регистры (адреса 64-6B)
с виртуальными функциями он был осторожнее — действительно вызывал функцию по указателю (адреса B0-DE)

если выигрыш по вызовам не виртуальных функций можно оспорить, то с виртуальными всё честно — функции действительно вызываются.

дизассемблированный код BCB не приводится ввиду его некрасивости и нелогичности.

это было о компиляторах, а теперь попробую вернуться к нервоначальному впросу — медленнее ли виртуальные функции. если заставить WC генерировать не оптимизированный код (с проверкой стека, передачей аргументов через стек, без заглядывания вперёд и т.п.) то времена будут такие:
f1(): 1000 mlns calls per 22.1 sec
f2(): 1000 mlns calls per 26.3 sec
и разница между прямым и косвенным вызовами всего 20%, что на первый взгляд достаточно много, но не следует забывать, что "пустые" функции, состоящии из 1 или 2х операций никто не делает и при вызове виртуальной функции, с телом в 20-50 операций, накладные расходы на вызов по указателю будут нивелированы и составят 1-2% которыми уже можно пожетрвовать.
Георгий
Отправлено: 24.02.2004, 19:52


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



неужели это правда???
тогда .NET рулит...
CODE
WinCon (сокращение от Windows Controller) разработан на базе процессора Intel
Strong ARM 206МГц, традиционно используемом производителями карманных компьютеров
(КПК). Впервые в не PC-совместимый контроллер была встроена система программирования
контроллеров Микро TRACE MODE. Это стало возможным, благодаря применению в контроллере
операционной системы Windows CE.NET. Появление Микро TRACE MODE под Windows CE.NET
является знаковым событием, так как открывает дорогу к тиражированию решений
на базе интегрированной SCADA/HMI и Softlogic системы TRACE MODE применительно
к любым аппаратным платформам, поддерживающим данную операционную систему. По
сравнению с другими операционными системами, Windows CE.NET имеет целый ряд преимуществ:

- операционная система жесткого реального времени;
- малый размер ядра;
- высокая скорость загрузки;
- встроенная сеть TCP/IP;
- развитый графический интерфейс и низкая стоимость;

Вернуться в Флейм