Вверх ↑
Этот топик читают: Гость
Ответов: 273
Рейтинг: 29
#1: 2009-05-29 17:34:57 ЛС | профиль | цитата
Делал простенький шифраторф/дешифратор, все работает, но тормозит жутко при чтении/записи, т.к. читает файлы побайтово. Можно ли как-то кеш прикрутить? Как его вообще организовать? В Делфи/VB была такая штука, как маппинг файла в память, но в хиасме вроде ниче такого нет... Схемка приаттачена.
Зы, эта схемка при обработке файла меняет порядок следования битов в каждом байте на обратный Соответственно при первой обработке файл становится "битым", т.е. воспринимается как бессмысленная каша, а при второй обработке восстанавливается исходная рабочая версия файла. Для дома самое оно.
code_13532.txt

------------ Дoбавленo в 17.55:
Если влом в схеме копатся, хотябы словами расскажите, как в хиасме можно ускорить чтение/запись, а то эта схемка тока 5кб/сек выдает.
карма: 0

0
файлы: 1code_13532.txt [4.7KB] [179]
Главный модератор
Ответов: 2999
Рейтинг: 396
#2: 2009-05-29 18:29:13 ЛС | профиль | цитата
Ищите по форуму - год или два назад обсуждали эту проблему.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Администрация
Ответов: 15295
Рейтинг: 1519
#3: 2009-05-29 18:37:43 ЛС | профиль | цитата
копируем в MemoryStream и работаем с ним уже
карма: 27
0
Ответов: 8926
Рейтинг: 823
#4: 2009-05-29 19:02:23 ЛС | профиль | цитата
tomas, 75% времени обработки занимает преобразование байтов: code_13534.txt, сначала надо копать в этом направлении.
карма: 19

0
файлы: 1code_13534.txt [3.4KB] [157]
Ответов: 273
Рейтинг: 29
#5: 2009-05-29 19:17:37 ЛС | профиль | цитата
Хорошо, поработаю с этим MemoryStream.
Насчет преобразования байтов: В принципе можно ускорить алгоритм, но все-равно, даже увеличение скорости вчетверо(до 20кб/сек) слишком мало. Копать надо именно в сторону кеша, т.к. побайтовый доступ к файлу слишком медленный.
карма: 0

0
Ответов: 3851
Рейтинг: 159
#6: 2009-05-29 20:23:39 ЛС | профиль | цитата
tomas писал(а):
побайтовый доступ к файлу слишком медленный
скопируй сразу кусок в память - это HiAsm позволяет..
карма: 0
начавший
0
Ответов: 8926
Рейтинг: 823
#7: 2009-05-29 20:34:08 ЛС | профиль | цитата
tomas, на моём кмпьютере FileStream читается ~1 Мб за 13 сек, MemoryStream - за 10 сек
карма: 19

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#8: 2009-05-29 20:34:11 ЛС | профиль | цитата
code_13535.txt
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
файлы: 1code_13535.txt [1.6KB] [224]
Разработчик
Ответов: 26151
Рейтинг: 2127
#9: 2009-05-29 23:12:04 ЛС | профиль | цитата
Можно попробовать вот такой код (реверс бит в байте написан на ассемблере, за основу взята схема Nica)


Add(MainForm,78857,294,203)
{
Left=21
Top=105
SavePosName="MyProject"
Point(Close)
}
Add(DoData,72744,490,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,432)(394,432)(394,454)])
link(onStop,72744:doData,[])
link(End,2940:Size,[])
}
Add(DataToFile,83748,511,441)
{
link(Stream,6915400:Var3,[(517,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,62742:doOpen,[(537,335)(537,377)])
link(onEvent7,58053:doFor,[(350,342)(350,384)])
link(onEvent8,62742:doClose,[(529,349)(529,384)])
}
Add(DataToFile,60844,406,441)
{
link(onGet,7325296:doInput,[])
link(Stream,2940:Stream,[(412,299)(426,299)])
}
Add(MemoryStream,46227,490,294)
{
}
Add(FileStream,62742,546,371)
{
Mode=1
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,483,350)
{
link(Data,46227:Stream,[])
}
Add(InlineCode,7325296,455,441)
{
@Hint=#11:Revers 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,83748:doPut,[])
}
Add(DropFile,15956738,371,203)
{
link(onDropFile,5717:doOpen,[])
}
Add(Edit,11995777,546,294)
{
Left=25
Top=15
Width=120
Text="1.bin"
}


Быстрее можно сделать, читая Cardinal (Dword), но сложность возникает с длинами файлов некратными четырем
карма: 22

0
Ответов: 8926
Рейтинг: 823
#10: 2009-05-29 23:34:07 ЛС | профиль | цитата
nesco, принцип: "Ни строчки кода" нарушаем? Тогда уж сразу компонент делать надо!
карма: 19

0
Ответов: 2125
Рейтинг: 159
#11: 2009-05-29 23:36:41 ЛС | профиль | цитата
Самое быстрое преобразование - табличное. Сначала готовим массив из 256 значений, а потом используем входной байт как индекс при чтении из массива, считанное значение записывается в файл.
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#12: 2009-05-29 23:42:58 ЛС | профиль | цитата
Леонид писал(а):
принцип: "Ни строчки кода" нарушаем?

Ну, про код ничего не написано было, и задание "Ни строчки кода" никто не ставил. Зато, я на кошках потренировался

tsdima писал(а):
Самое быстрое преобразование - табличное

Согласен, можно и табличное воткнуть
карма: 22

0
Ответов: 8926
Рейтинг: 823
#13: 2009-05-30 00:36:56 ЛС | профиль | цитата
nesco, (Рад за сочинцев, уже сами шутить начали! )
карма: 19

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#14: 2009-05-30 01:55:31 ЛС | профиль | цитата
Вот схема тестирования различных типов реализации реверс-алгоритма (по-умолчанию стоит табличный на компонентах).
Результат вскрытия показал, что табличный алгоритм на компонентах не сильно отличается от ассемблерного кода 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,[])
}

карма: 22

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#15: 2009-05-30 16:24:29 ЛС | профиль | цитата
nesco писал(а):
за основу взята схема Nica


Эту схему выложил на форум Galkov
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)