кстате у дельфе с оптимизацией все гуд. вот довольно таки нетривиальный вычислительный код (магическим оброзом рисчующий папоротнег) Code (Text): const a : array[0..3,0..2,0..3] of integer = (((0,0,0,0),(0,20,0,0),(0,0,0,0)), ((85,0,0,0),(0,85,11,70),(0,-10,85,0)), ((31,-41,0,0),(10,21,0,21),(0,0,30,0)), ((-29,40,0,0),(10,19,0,56),(0,0,30,0))); procedure main; var i:integer, x,y,z, New_X,New_Y : integer; b : array[1..100] of Integer; Begin SetMode($12); repeat for i:=1 to 100 do begin b[i]:=random(5); if b[i]>3 then b[i]:=1; end; for i:=1 to 100 do begin new_x:=(a[b[i],0,0]*x+a[b[i],0,1]*y+a[b[i],0,2]*z) div 100 +a[b[i],0,3]; new_y:=((a[b[i],1,0]*x+a[b[i],1,1]*y+a[b[i],1,2]*z) div 100) +a[b[i],1,3]; z:= ((a[b[i],2,0]*x+a[b[i],2,1]*y+a[b[i],2,2]*z) div 100)+a[b[i],2,3]; x:=New_X;y:=New_Y; PutPixel(2, 380-y,350-x+z); end; until key <> 0; SetMode(3); end; и вот каг оно оформило процедурку майн, Code (Text): 000000AC: 53 push ebx 000000AD: 56 push esi 000000AE: 57 push edi 000000AF: 55 push ebp 000000B0: 81C460FEFFFF add esp,0FFFFFE60 000000B6: BEF0010000 mov esi,0000001F0 000000BB: 66B81200 mov ax,00012 000000BF: E8CCFFFFFF call 000000090 000000C4: BF64000000 mov edi,000000064 000000C9: 8D5C2410 lea ebx,[esp][10] 000000CD: B805000000 mov eax,000000005 000000D2: E8A1FFFFFF call 000000078 000000D7: 8BE8 mov ebp,eax 000000D9: 892B mov [ebx],ebp 000000DB: 83FD03 cmp ebp,003 000000DE: 7E06 jle 0000000E6 000000E0: C70301000000 mov d,[ebx],000000001 000000E6: 83C304 add ebx,004 000000E9: 4F dec edi 000000EA: 75E1 jne 0000000CD 000000EC: BF64000000 mov edi,000000064 000000F1: 8D5C2410 lea ebx,[esp][10] 000000F5: 8B0B mov ecx,[ebx] 000000F7: 03C9 add ecx,ecx 000000F9: 8D0C49 lea ecx,[ecx][ecx]*2 000000FC: 8B04CE mov eax,[esi][ecx]*8 000000FF: F72C24 imul d,[esp] 00000102: 8B54CE04 mov edx,[esi][ecx]*8[04] 00000106: 0FAF542404 imul edx,[esp][04] 0000010B: 03C2 add eax,edx 0000010D: 8B54CE08 mov edx,[esi][ecx]*8[08] 00000111: 0FAF542408 imul edx,[esp][08] 00000116: 03C2 add eax,edx 00000118: BD64000000 mov ebp,000000064 0000011D: 99 cdq 0000011E: F7FD idiv ebp 00000120: 8BE8 mov ebp,eax 00000122: 036CCE0C add ebp,[esi][ecx]*8[0C] 00000126: 8B44CE10 mov eax,[esi][ecx]*8[10] 0000012A: F72C24 imul d,[esp] 0000012D: 8B54CE14 mov edx,[esi][ecx]*8[14] 00000131: 0FAF542404 imul edx,[esp][04] 00000136: 03C2 add eax,edx 00000138: 8B54CE18 mov edx,[esi][ecx]*8[18] 0000013C: 0FAF542408 imul edx,[esp][08] 00000141: 03C2 add eax,edx 00000143: 51 push ecx 00000144: B964000000 mov ecx,000000064 00000149: 99 cdq 0000014A: F7F9 idiv ecx 0000014C: 59 pop ecx 0000014D: 0344CE1C add eax,[esi][ecx]*8[1C] 00000151: 8944240C mov [esp][0C],eax 00000155: 8B44CE20 mov eax,[esi][ecx]*8[20] 00000159: F72C24 imul d,[esp] 0000015C: 8B54CE24 mov edx,[esi][ecx]*8[24] 00000160: 0FAF542404 imul edx,[esp][04] 00000165: 03C2 add eax,edx 00000167: 8B54CE28 mov edx,[esi][ecx]*8[28] 0000016B: 0FAF542408 imul edx,[esp][08] 00000170: 03C2 add eax,edx 00000172: 51 push ecx 00000173: B964000000 mov ecx,000000064 00000178: 99 cdq 00000179: F7F9 idiv ecx 0000017B: 59 pop ecx 0000017C: 0344CE2C add eax,[esi][ecx]*8[2C] 00000180: 89442408 mov [esp][08],eax 00000184: 892C24 mov [esp],ebp 00000187: 8B44240C mov eax,[esp][0C] 0000018B: 89442404 mov [esp][04],eax 0000018F: 66B95E01 mov cx,0015E 00000193: 662B0C24 sub cx,[esp] 00000197: 66034C2408 add cx,[esp][08] 0000019C: 66BA7C01 mov dx,0017C 000001A0: 662B542404 sub dx,[esp][04] 000001A5: B002 mov al,002 000001A7: E8F4FEFFFF call 0000000A0 000001AC: 83C304 add ebx,004 000001AF: 4F dec edi 000001B0: 0F853FFFFFFF jne 0000000F5 000001B6: E8D9FEFFFF call 000000094 000001BB: 84C0 test al,al 000001BD: 0F8401FFFFFF je 0000000C4 000001C3: 66B80300 mov ax,00003 000001C7: E8C4FEFFFF call 000000090 000001CC: 81C4A0010000 add esp,0000001A0 000001D2: 5D pop ebp 000001D3: 5F pop edi 000001D4: 5E pop esi 000001D5: 5B pop ebx 000001D6: C3 retn Регистровое заполнение меня очень даже устраивает, вся exe прога 740байт весом)))
SII в данной проге это не критично. Хотя для тех у кого едет шиза, по поводу тормозных иструкций x86 проциков, могут заюзать фишку с инетля с++, (работающий так же непонятно как фракталы). Code (Text): function div100 (_eax:integer):integer; asm mov ecx, eax mov eax, 51EB851Fh imul ecx sar edx, 5 sar ecx, 1Fh sub edx, ecx mov eax, edx end; заюзав примерно так Code (Text): new_x:= div100(a[b[i],0,0]*x+a[b[i],0,1]*y+a[b[i],0,2]*z)+a[b[i],0,3]; и будет счастие.
bugaga Речь не о критичности или некритичности, а об умении компилятора оптимизировать генерируемый код. Дельфи это делает намного хуже что мелкомягкого Си++, что интеловских Си++ и Фортрана. Хотя для бизнес-приложений это действительно никакой роли не играет.
По большому счёту, ИМХО будущее за интерпретируемыми языками. Ведь не зря же ява достаточно популярна за рубежом, и уверенно теснит си с плюсами.
_proteus Жаба -- двойной компилятор, а не интерпретатор. Сначала исходный текст (на самой жабе) компилируется в байт-код, а потом, при исполнении, жабовская виртуальная машина компилирует (а не интерпретирует) этот байт-код. Только компиляция там осуществляется не предварительно, а в процессе исполнения, по мере надобности. Т.е. код, который при данном прогоне программы не выполняется ни разу, скомпилирован не будет, а, например, многократно выполняющийся цикл будет скомпилирован единожды.
Ява совмещает в себе интерпретатор с компилятором. Первые вызовы метода (точное число зависит от версии и настроек) интерпретируются, потом байткод компилируется в нативный и выполняется напрямую. Так работает стандартный mixed mode, кроме него можно задать режимы "только интерпретация" или "полная компиляция", которые используются обычно только в тестовых целях. .NET интерпретатора не имеет, если правильно помню.
Мне вообще не очень понятно, отчего что Жаба, что МСИЛ, не компилируются в нормальные Win32 exe? Ведь де-факто компилятор из байт-кода в машинный код уже написан, только вывод осуществляет исключительно в память. В чём дао такого подхода, кроме натужного гона про кроссплатформенность, которая реально мало кого волнует (и в первую очередь не волнует самого Мелкософта)?
CyberManiac А зачем? Кому нужен этот "нормальный" exe? Дело в том, что в Яве (.NET не уверен, могу ошибаться) используется динамическое компилирование с учетом статистики выполнения. Вместо того, чтобы перевести весь байткод в машинный один раз и навсегда, переводятся и оптимируются только значимые куски. Каждые пару тысяч вызовов статистика обновляется и код при необходимости компилируется заново с дополнительными оптимизациями. А HotSpot compiler позволяет компилировать на уровне отдельных групп инструкций, не тратя времени на обработку редко используемого кода (которого как правило подавляющее большинство). JIT и HotSpot - это следующий этап в развитиии техники компиляции. Поэтому Яве и .NET просто незачем возвращаться обратно к старым схемам. Ну и конечно та самая переносимость кода, которая играет огромную роль. Если кто-то программирует исключительно для домашнего компьютера под Windows, то это еще не значит, что кроссплатформенности не существует
Stiver То есть все эти извращения - оттого, что до сих пор никто не родил языка, в котором можно указывать предпочтительный путь исполнения... А что, у нас такой богатый выбор операционных систем? Целых полторы штуки, конечно, есть ради чего огород городить... Ну как же, существует конечно. А ещё существует демократия, светлое коммунистическое будущее и пиво-чипсовая диета для похудания :-D
Ну про МСИЛ не знаю, а вот про Java скажу: вы знаете, что такое Java Reflections API? Попробуйте реализовать это в компилируемом языке.
CyberManiac То есть все эти извращения - оттого, что до сих пор никто не родил языка, в котором можно указывать предпочтительный путь исполнения... А как ты его укажешь, если он все время меняется? Например у меня сейчас по выходным и праздникам поступают и обрабатываются совсем другие данные, чем в середине недели. Если система умеет самостоятельно подстраиваться под режимы исполнения, то это очень здорово. А что, у нас такой богатый выбор операционных систем? Целых полторы штуки, конечно, есть ради чего огород городить... Ну у меня тут например стоят: Windows 2000 Server, SuSE Linux 9 и SunFire (не помню, какая точно) под Solaris 9. Работать должно на всех, иначе ..хм.. будет нехорошо в масштабах страны, скажем так И меня очень радует, что я могу спокойно писать на Яве, почти не мучаясь проблемами совместимости.
Stiver В абсолютном большинстве программ в каждой ветке существует предпочтительный путь исполнения, так уж всё в мире устроено, что обычно случается что-то одно, а вот другое - намного реже. И что чаще, а что реже, обычно определяется сбором статистических данных. Если в будни приходят одни данные, а по выходным - другие, очевидно, что будней больше и эффективностью работы в выходные можно пожертвовать. Что-то у меня идея профилирования и дооптимизации в процессе исполнения вызывает определённые сомнения насчёт скорости работы всего этого дела, ибо профайлер с анализатором статистики в длинном цикле с коротким телом - это не фунт изюма, а тот ещё тормозистор. К тому же прожорливость Жабы и задумчивость при сборке мусора - это уже притча во языцех. Чудеса, конечно, случаются, но очень уж редко и почти всегда - не по заказу. Я бы сказал, что продвижение Жабы - вообще вопрос не прикладного программирования, а заинтересованности Sun в лозунге "Жаба повсюду". У Микрософта аналогичный интерес в "дот нете повсюду". А мой интерес - чтобы по-быстрому порешить текущие задачи, после чего развалиться в кресле и читать "Эго" или "Дигитал Фото", но никак не объяснять пользователям, как и почему им надо установить сто мегабайт всякого дерьма, а то задача не запускается. И на каждую, небось, по админу... Чем не повод подумать о сокращении поголовья ОСей в этом зоопарке...