Вот схема тестирования различных типов реализации реверс-алгоритма (по-умолчанию стоит табличный на компонентах).
Результат вскрытия показал, что табличный алгоритм на компонентах не сильно отличается от ассемблерного кода IC, и на порядок быстрее исходной реализации. Схему можно потестировать самому переключая входной линк на схеме между разными модулями. Из всего следует, что самым быстрым предполагается ассемблерная реализация табличного алгоритма (по-необходимости, выполняется своими силами и за свой счет  )
Add(MainForm,78857,294,203) { Left=21 Top=105 SavePosName="MyProject" Point(Close) } Add(DoData,72744,581,385) { link(onEventData,62742:doCopyFromStream,[]) link(Data,6915400:Var2,[]) } Add(MemoryStream,2940,420,259) { Point(doPosition) link(SrcStream,5717:Stream,[]) } Add(FileStream,5717,420,203) { link(onLoad,43116:doEvent1,[(465,209)(465,189)(282,189)(282,300)]) } Add(For,58053,420,378) { Start=1 link(onEvent,60844:doGet,[(462,384)(462,365)(394,365)(394,489)]) link(onStop,72744:doData,[]) link(End,2940:Size,[]) } Add(DataToFile,83748,602,476) { link(Stream,6915400:Var3,[(608,359)]) } Add(Hub,43116,294,294) { OutCount=8 link(onEvent1,2940:doClear,[(364,300)(364,272)]) link(onEvent2,46227:doClear,[]) link(onEvent3,2940:doCopy,[(395,314)(395,265)]) link(onEvent4,5717:doClose,[(351,321)(351,216)]) link(onEvent5,34245:doData,[]) link(onEvent6,13577346:doStart,[(318,335)(318,364)(213,364)(213,202)]) link(onEvent7,58053:doFor,[(350,342)(350,384)]) link(onEvent8,13577346:doStop,[(325,349)(325,371)(224,371)(224,209)]) } Add(DataToFile,60844,406,476) { link(onGet,4970074:doRead,[]) link(Stream,2940:Stream,[(412,299)(426,299)]) } Add(MemoryStream,46227,581,294) { } Add(FileStream,62742,637,371) { Mode=1 AutoCopy=0 Point(doCopyFromStream) link(FileName,11995777:Text,[]) } Add(DoData,34245,357,322) { Data=Integer(0) link(onEventData,2940:doPosition,[(405,328)(405,279)]) } Add(GetDataEx,6915400,574,350) { link(Data,46227:Stream,[]) } Add(InlineCode,7325296,511,518) { @Hint=#12:Reverse BYTE| WorkPoints=#7:doInput| EventPoints=#8:onResult| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|24: onResult:THI_Event;|51: procedure doInput(var Data:TData; Index:word);|5: end;|0:|14:implementation|0:|30:procedure THiAsmClass.doInput;|3:var|17: A, B: Cardinal;|5:begin|29: A := Byte(ToInteger(Data));|3:asm|16: MOV B, 0;|16: SHL A, 24|18: MOV ECX, 8;|6:@@loo:|16: RCL A, 1;|16: RCR B, 1;|16: LOOP @@loo|16: SHR B, 24|6:end; |28: _hi_onEvent(onResult, B);|4:end;|0:|4:end.| link(onResult,7026055:doWork2,[]) } Add(DropFile,15956738,371,203) { link(onDropFile,5717:doOpen,[]) } Add(Edit,11995777,637,294) { Left=25 Top=15 Width=120 Text="1.bin" } Add(IntegerArray,13904064,511,427) { IntArray=['0'=0,'1'=128,'2'=64,'3'=192,'4'=32,'5'=160,'6'=96,'7'=224,'8'=16,'9'=144,'10'=80,'11'=208,'12'=48,'13'=176,'14'=112,'15'=240,'16'=8,'17'=136,'18'=72,'19'=200,'20'=40,'21'=168,'22'=104,'23'=232,'24'=24,'25'=152,'26'=88,'27'=216,'28'=56,'29'=184,'30'=120,'31'=248,'32'=4,'33'=132,'34'=68,'35'=196,'36'=36,'37'=164,'38'=100,'39'=228,'40'=20,'41'=148,'42'=84,'43'=212,'44'=52,'45'=180,'46'=116,'47'=244,'48'=12,'49'=140,'50'=76,'51'=204,'52'=44,'53'=172,'54'=108,'55'=236,'56'=28,'57'=156,'58'=92,'59'=220,'60'=60,'61'=188,'62'=124,'63'=252,'64'=2,'65'=130,'66'=66,'67'=194,'68'=34,'69'=162,'70'=98,'71'=226,'72'=18,'73'=146,'74'=82,'75'=210,'76'=50,'77'=178,'78'=114,'79'=242,'80'=10,'81'=138,'82'=74,'83'=202,'84'=42,'85'=170,'86'=106,'87'=234,'88'=26,'89'=154,'90'=90,'91'=218,'92'=58,'93'=186,'94'=122,'95'=250,'96'=6,'97'=134,'98'=70,'99'=198,'100'=38,'101'=166,'102'=102,'103'=230,'104'=22,'105'=150,'106'=86,'107'=214,'108'=54,'109'=182,'110'=118,'111'=246,'112'=14,'113'=142,'114'=78,'115'=206,'116'=46,'117'=174,'118'=110,'119'=238,'120'=30,'121'=158,'122'=94,'123'=222,'124'=62,'125'=190,'126'=126,'127'=254,'128'=1,'129'=129,'130'=65,'131'=193,'132'=33,'133'=161,'134'=97,'135'=225,'136'=17,'137'=145,'138'=81,'139'=209,'140'=49,'141'=177,'142'=113,'143'=241,'144'=9,'145'=137,'146'=73,'147'=201,'148'=41,'149'=169,'150'=105,'151'=233,'152'=25,'153'=153,'154'=89,'155'=217,'156'=57,'157'=185,'158'=121,'159'=249,'160'=5,'161'=133,'162'=69,'163'=197,'164'=37,'165'=165,'166'=101,'167'=229,'168'=21,'169'=149,'170'=85,'171'=213,'172'=53,'173'=181,'174'=117,'175'=245,'176'=13,'177'=141,'178'=77,'179'=205,'180'=45,'181'=173,'182'=109,'183'=237,'184'=29,'185'=157,'186'=93,'187'=221,'188'=61,'189'=189,'190'=125,'191'=253,'192'=3,'193'=131,'194'=67,'195'=195,'196'=35,'197'=163,'198'=99,'199'=227,'200'=19,'201'=147,'202'=83,'203'=211,'204'=51,'205'=179,'206'=115,'207'=243,'208'=11,'209'=139,'210'=75,'211'=203,'212'=43,'213'=171,'214'=107,'215'=235,'216'=27,'217'=155,'218'=91,'219'=219,'220'=59,'221'=187,'222'=123,'223'=251,'224'=7,'225'=135,'226'=71,'227'=199,'228'=39,'229'=167,'230'=103,'231'=231,'232'=23,'233'=151,'234'=87,'235'=215,'236'=55,'237'=183,'238'=119,'239'=247,'240'=15,'241'=143,'242'=79,'243'=207,'244'=47,'245'=175,'246'=111,'247'=239,'248'=31,'249'=159,'250'=95,'251'=223,'252'=63,'253'=191,'254'=127,'255'=255] } Add(ArrayRW,4970074,511,476) { link(onRead,5034997:doWork2,[]) link(Array,13904064:Array,[]) } Add(TimeCounter,13577346,231,196) { Precision=1 link(onStop,78857:doCaption,[]) } Add(MultiElementEx,16246726,511,560) { @Hint=#8:Инвертор| link(onNumber,7026055:doWork3,[(571,566)]) } BEGIN_SDK Add(EditMultiEx,4802494,21,21) { WorkCount=#24:doCrypt=Инвертирует байт| EventCount=#75:onNumber=Событие происходит после инвертирования байта и выдает его в поток| VarCount=#27:Number=Инвертированный байт| DataCount=#23:Data=Инвертируемый байт| Width=531 Height=466 link(doCrypt,6521553:doEvent1,[(81,27)(81,286)]) link(Number,618167:Number,[(27,449)(265,449)]) } Add(Memory,728938,287,203) { } Add(Memory,6993452,294,245) { } Add(IntToBits,14517467,203,315) { Data_0=Integer(1) Data_1=Integer(0) link(Value,4802494:Data,[(209,168)(27,168)]) link(onBit1,4657016:doValue,[(247,321)(247,41)]) link(onBit2,16247303:doValue,[(249,328)(249,83)]) link(onBit3,16738823:doValue,[(251,335)(251,125)]) link(onBit4,2875915:doValue,[(253,342)(253,167)]) link(onBit5,728938:doValue,[(255,349)(255,209)]) link(onBit6,6993452:doValue,[(257,356)(257,251)]) link(onBit7,3088944:doValue,[(259,363)(259,293)]) link(onBit8,15086153:doValue,[(261,370)(261,335)]) } Add(BitsToInt,618167,259,378) { Count=8 link(onNumber,4802494:onNumber,[(435,384)(435,27)]) link(Bit1,4657016:Value,[]) link(Bit2,16247303:Value,[]) link(Bit3,16738823:Value,[]) link(Bit4,2875915:Value,[]) link(Bit5,728938:Value,[]) link(Bit6,6993452:Value,[]) link(Bit7,3088944:Value,[]) link(Bit8,15086153:Value,[]) } Add(Memory,15086153,308,329) { } Add(Memory,4657016,259,35) { } Add(Memory,16247303,266,77) { } Add(Memory,16738823,273,119) { } Add(Memory,2875915,280,161) { } Add(Memory,3088944,301,287) { } Add(Hub,6521553,140,280) { link(onEvent1,14517467:doBitsRev,[(188,286)(188,328)]) link(onEvent2,618167:doNumber,[(182,293)(182,384)]) } END_SDK Add(HubEx,5034997,567,469) { link(onEvent,83748:doPut,[]) } Add(HubEx,7026055,567,511) { Angle=3 link(onEvent,5034997:doWork3,[]) }
|