想在软件中用点内嵌汇编,提升一下软件的档次 ( 积分: 50 )

  • 主题发起人 主题发起人 我爱PASCAL
  • 开始时间 开始时间
还是可以比编译器优化,最好的手表是手工作的。
DELPHI的大师将他们的汇编功力用软件实再出来,就
像人工智能一样,离他本人的汇编水平还是有所差距。
 
我这段核心代码是处理成批文件的,一个字节一个字节的处理,文件批量加密的,加密一百兆就要一亿次运算,所以很有必要优化一下,不过自已的功力不够来向大家取经。
 
to ufo!
以我这样德智体全面发育的人,没你那么多时间去研究这个,要研究就研究股市楼市赚钱的东西。
代码是网上的,网址在这里: http://doc.greatso.com/20070531/8492/2.html 自己去研究。
我最厉害的地方就是找到了这个网址,而楼主没去找,请加分,谢谢。
 
像加密一百兆这种,其实先不是考虑汇编优化,汇编有兼容问题,Win32以外的版本就
不能用了,应该考虑io问题,即如何快速读写数据,这里的效益比较大。
 
想不到有如此多之高手云集此处,不然我一定会发一百分。
你说的IO问题目我想过,目前慢就慢在读写文件,我是tmemorystream一次读入处理完
再savetofile,我也知道有文件映像和快速异步之类,不过目前内功不足。先将就了,
要求内存大点就是了。大文件就慢了,目前最佳大小是二三十M。速度最快。而且
savetofile系DELPHI的人所写,内功一定不错,比我自已写一个可能要快吧。
还有汇编兼容问题,没考虑,delphi的原代码里还有好多汇编呢。我这个也不打算用到
Linux去。能在windows上卖几个钱就不错了。
 
你这篇文章找得非常好,不过五十分各位高手都分点你就不多了,但是你不会在意这点分的,因为你经常一出手就是三百分。
 
使用 tmemorystream 读入比内存大的文件,等于将文件从硬盘这边复制硬盘的另一边,
然后再使用文件映射来读写一样,文件映射不难,现将文件映射,文件就变成内存一样,
创建视图,实际就是选文件的一段,对这段文件操作,我觉得比流还容易。delphi 的
win32里面有汇编,.net版本的没有汇编,因为.net实际是被.net解释执行,不支持汇编,
所以嵌入汇编有兼容问题,还要pchar ^ @ 等等都不能使用,这个真实要留意。
 
>>使用 tmemorystream 读入比内存大的文件,等于将文件从硬盘这边复制硬盘的另一边
可能还要慢些,因为读进来先要把其它程序腾出去,保存后又把其它程序移进来。

因为我加密时是要对全部的字节运算的,读了一部分文件后还不能马上写回去,因为加密的结果是和全部源文件的数据相关的。有可能取随时多次存取数据:如读到内存中就是对数组的操作,如是文件就成了读写文件。内存映像对大文件可能快些,对小文件,如果还是只读当前一点出来反而不好。不知道它是不是如文件小一内存就一次读入。所以不明情况之下没用。
 
其实,汇编的兼容性是很好的,汇编只和cpu有关,和操作系统无关。只是,我们写在delphi代码内的汇编,已经不是纯粹的汇编了,宝兰称之为basm,汇编内可能调用了windows的api或者单元内的某个变量等。
类似楼主这样的情况,用内存映像,建立两个文件,一个读,一个写。
这样,文件读完,也就写完了。api介绍:
createfilemapping 用来建立内存映象文件
mapviewoffile用来访问映象文件,该函数会返回一个指向共享内存块的特定指针。
 
我觉得楼住应该研究一下加密算法,看看是否可以将大文件分块处理,虽然加密要对
整个文件运算,但是可以琢磨一下中间结果和最终结果的相关性,寻找一个合适的算
法,减少在加密运算时花费的时间。还有,如果算法本身速度无法提高,便于编程减
少IO处理的也可以。
 
>>建立两个文件,一个读,一个写。
那个读完的文件怎么办,直接删除不安全,还要覆盖一次
 
>>将大文件分块处理
没用分块的算法,分块的用文件映像比较好取一点加密又写回去
目前的加密速度很快,只是要一次读写全部才快。
 
大家都乐意将代码写成win32/.net环境下都能兼容的,但在vcl.net环境下,汇编无法使用,所以使用汇编之后,等于失去了对.net的兼容,大家编程的时候最好还是不去用汇编
和pchar ~ @等等指针性的东西,连Scanline也要变通使用。
 
我写游戏效果时用汇编进行代码优化时发现一点:
象 mov ecx,eax 这样的操作没什么效果,
而 mov ecx,[eax] 或 mov [eax],ecx 是耗时大户,
所以能一次能读入几个节就读几个,能写几个就写几个。
MMX加速的原理也在这里。MMX加速是成倍的,而不是5%的小儿科目。
所以认为 kinneng 说的是对的:应该考虑io问题
 
不知道mmx和3dnow是否兼容,现在很多人买k**的双核CPU来装机。
 
mmx的AMD支持,3DNOW的可能后来INTEL也支持了
 
想知道delphi那个版本可以直接写mmx的汇编指令
 
似乎从 7 开始就支持直接 mmx 指令
asm
emms
end;
 
应该说
MOV EAX, [var_A]
MOV EDX, [var_D]
MOV [var_A], EDX ;// 这一句和上一句有相关性
MOV [var_D], EAX
是相对比较快的方案. XCHG 代码会比较短小

其实核心思想就是增加可能的并行.

整体调优还要看你的程序构架.
 
后退
顶部