我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-02 #41 还是可以比编译器优化,最好的手表是手工作的。 DELPHI的大师将他们的汇编功力用软件实再出来,就 像人工智能一样,离他本人的汇编水平还是有所差距。
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-02 #42 我这段核心代码是处理成批文件的,一个字节一个字节的处理,文件批量加密的,加密一百兆就要一亿次运算,所以很有必要优化一下,不过自已的功力不够来向大家取经。
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #43 to ufo! 以我这样德智体全面发育的人,没你那么多时间去研究这个,要研究就研究股市楼市赚钱的东西。 代码是网上的,网址在这里: http://doc.greatso.com/20070531/8492/2.html 自己去研究。 我最厉害的地方就是找到了这个网址,而楼主没去找,请加分,谢谢。
to ufo! 以我这样德智体全面发育的人,没你那么多时间去研究这个,要研究就研究股市楼市赚钱的东西。 代码是网上的,网址在这里: http://doc.greatso.com/20070531/8492/2.html 自己去研究。 我最厉害的地方就是找到了这个网址,而楼主没去找,请加分,谢谢。
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #45 像加密一百兆这种,其实先不是考虑汇编优化,汇编有兼容问题,Win32以外的版本就 不能用了,应该考虑io问题,即如何快速读写数据,这里的效益比较大。
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #46 想不到有如此多之高手云集此处,不然我一定会发一百分。 你说的IO问题目我想过,目前慢就慢在读写文件,我是tmemorystream一次读入处理完 再savetofile,我也知道有文件映像和快速异步之类,不过目前内功不足。先将就了, 要求内存大点就是了。大文件就慢了,目前最佳大小是二三十M。速度最快。而且 savetofile系DELPHI的人所写,内功一定不错,比我自已写一个可能要快吧。 还有汇编兼容问题,没考虑,delphi的原代码里还有好多汇编呢。我这个也不打算用到 Linux去。能在windows上卖几个钱就不错了。
想不到有如此多之高手云集此处,不然我一定会发一百分。 你说的IO问题目我想过,目前慢就慢在读写文件,我是tmemorystream一次读入处理完 再savetofile,我也知道有文件映像和快速异步之类,不过目前内功不足。先将就了, 要求内存大点就是了。大文件就慢了,目前最佳大小是二三十M。速度最快。而且 savetofile系DELPHI的人所写,内功一定不错,比我自已写一个可能要快吧。 还有汇编兼容问题,没考虑,delphi的原代码里还有好多汇编呢。我这个也不打算用到 Linux去。能在windows上卖几个钱就不错了。
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #47 你这篇文章找得非常好,不过五十分各位高手都分点你就不多了,但是你不会在意这点分的,因为你经常一出手就是三百分。
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #48 使用 tmemorystream 读入比内存大的文件,等于将文件从硬盘这边复制硬盘的另一边, 然后再使用文件映射来读写一样,文件映射不难,现将文件映射,文件就变成内存一样, 创建视图,实际就是选文件的一段,对这段文件操作,我觉得比流还容易。delphi 的 win32里面有汇编,.net版本的没有汇编,因为.net实际是被.net解释执行,不支持汇编, 所以嵌入汇编有兼容问题,还要pchar ^ @ 等等都不能使用,这个真实要留意。
使用 tmemorystream 读入比内存大的文件,等于将文件从硬盘这边复制硬盘的另一边, 然后再使用文件映射来读写一样,文件映射不难,现将文件映射,文件就变成内存一样, 创建视图,实际就是选文件的一段,对这段文件操作,我觉得比流还容易。delphi 的 win32里面有汇编,.net版本的没有汇编,因为.net实际是被.net解释执行,不支持汇编, 所以嵌入汇编有兼容问题,还要pchar ^ @ 等等都不能使用,这个真实要留意。
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #49 >>使用 tmemorystream 读入比内存大的文件,等于将文件从硬盘这边复制硬盘的另一边 可能还要慢些,因为读进来先要把其它程序腾出去,保存后又把其它程序移进来。 因为我加密时是要对全部的字节运算的,读了一部分文件后还不能马上写回去,因为加密的结果是和全部源文件的数据相关的。有可能取随时多次存取数据:如读到内存中就是对数组的操作,如是文件就成了读写文件。内存映像对大文件可能快些,对小文件,如果还是只读当前一点出来反而不好。不知道它是不是如文件小一内存就一次读入。所以不明情况之下没用。
>>使用 tmemorystream 读入比内存大的文件,等于将文件从硬盘这边复制硬盘的另一边 可能还要慢些,因为读进来先要把其它程序腾出去,保存后又把其它程序移进来。 因为我加密时是要对全部的字节运算的,读了一部分文件后还不能马上写回去,因为加密的结果是和全部源文件的数据相关的。有可能取随时多次存取数据:如读到内存中就是对数组的操作,如是文件就成了读写文件。内存映像对大文件可能快些,对小文件,如果还是只读当前一点出来反而不好。不知道它是不是如文件小一内存就一次读入。所以不明情况之下没用。
U ufo Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #50 其实,汇编的兼容性是很好的,汇编只和cpu有关,和操作系统无关。只是,我们写在delphi代码内的汇编,已经不是纯粹的汇编了,宝兰称之为basm,汇编内可能调用了windows的api或者单元内的某个变量等。 类似楼主这样的情况,用内存映像,建立两个文件,一个读,一个写。 这样,文件读完,也就写完了。api介绍: createfilemapping 用来建立内存映象文件 mapviewoffile用来访问映象文件,该函数会返回一个指向共享内存块的特定指针。
其实,汇编的兼容性是很好的,汇编只和cpu有关,和操作系统无关。只是,我们写在delphi代码内的汇编,已经不是纯粹的汇编了,宝兰称之为basm,汇编内可能调用了windows的api或者单元内的某个变量等。 类似楼主这样的情况,用内存映像,建立两个文件,一个读,一个写。 这样,文件读完,也就写完了。api介绍: createfilemapping 用来建立内存映象文件 mapviewoffile用来访问映象文件,该函数会返回一个指向共享内存块的特定指针。
T tseug Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #51 我觉得楼住应该研究一下加密算法,看看是否可以将大文件分块处理,虽然加密要对 整个文件运算,但是可以琢磨一下中间结果和最终结果的相关性,寻找一个合适的算 法,减少在加密运算时花费的时间。还有,如果算法本身速度无法提高,便于编程减 少IO处理的也可以。
我觉得楼住应该研究一下加密算法,看看是否可以将大文件分块处理,虽然加密要对 整个文件运算,但是可以琢磨一下中间结果和最终结果的相关性,寻找一个合适的算 法,减少在加密运算时花费的时间。还有,如果算法本身速度无法提高,便于编程减 少IO处理的也可以。
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #52 >>建立两个文件,一个读,一个写。 那个读完的文件怎么办,直接删除不安全,还要覆盖一次
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #53 >>将大文件分块处理 没用分块的算法,分块的用文件映像比较好取一点加密又写回去 目前的加密速度很快,只是要一次读写全部才快。
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #54 大家都乐意将代码写成win32/.net环境下都能兼容的,但在vcl.net环境下,汇编无法使用,所以使用汇编之后,等于失去了对.net的兼容,大家编程的时候最好还是不去用汇编 和pchar ~ @等等指针性的东西,连Scanline也要变通使用。
大家都乐意将代码写成win32/.net环境下都能兼容的,但在vcl.net环境下,汇编无法使用,所以使用汇编之后,等于失去了对.net的兼容,大家编程的时候最好还是不去用汇编 和pchar ~ @等等指针性的东西,连Scanline也要变通使用。
R redsky.l Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-03 #55 我写游戏效果时用汇编进行代码优化时发现一点: 象 mov ecx,eax 这样的操作没什么效果, 而 mov ecx,[eax] 或 mov [eax],ecx 是耗时大户, 所以能一次能读入几个节就读几个,能写几个就写几个。 MMX加速的原理也在这里。MMX加速是成倍的,而不是5%的小儿科目。 所以认为 kinneng 说的是对的:应该考虑io问题
我写游戏效果时用汇编进行代码优化时发现一点: 象 mov ecx,eax 这样的操作没什么效果, 而 mov ecx,[eax] 或 mov [eax],ecx 是耗时大户, 所以能一次能读入几个节就读几个,能写几个就写几个。 MMX加速的原理也在这里。MMX加速是成倍的,而不是5%的小儿科目。 所以认为 kinneng 说的是对的:应该考虑io问题
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-04 #56 不知道mmx和3dnow是否兼容,现在很多人买k**的双核CPU来装机。
我 我爱PASCAL Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-04 #57 mmx的AMD支持,3DNOW的可能后来INTEL也支持了
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-04 #58 想知道delphi那个版本可以直接写mmx的汇编指令
白 白河愁 Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-04 #59 似乎从 7 开始就支持直接 mmx 指令 asm emms end;
Z zjan521 Unregistered / Unconfirmed GUEST, unregistred user! 2007-06-04 #60 应该说 MOV EAX, [var_A] MOV EDX, [var_D] MOV [var_A], EDX ;// 这一句和上一句有相关性 MOV [var_D], EAX 是相对比较快的方案. XCHG 代码会比较短小 其实核心思想就是增加可能的并行. 整体调优还要看你的程序构架.
应该说 MOV EAX, [var_A] MOV EDX, [var_D] MOV [var_A], EDX ;// 这一句和上一句有相关性 MOV [var_D], EAX 是相对比较快的方案. XCHG 代码会比较短小 其实核心思想就是增加可能的并行. 整体调优还要看你的程序构架.