3
31415926
Unregistered / Unconfirmed
GUEST, unregistred user!
请看下文工:
字符串与动态数组的线程安全 (thread safety)
在 delphi 5 以前动态数组与长字符串的操作这些非线程安全调用是由引用计数来处理其临界问题的 ,而自 delphi5 起就改为直接在一些临界指令前加 lock 指令前缀来避免这个问题。不幸的是这一修改的代价相当昂贵 ,因为在 pentium ⅱ处理器中 lock 指令相当费时 ,大概要耗费额外的 28 个指令周期来完成这一操作 ,因而整体效率至少下降一半。
解决这个问题的办法只有一个 ,那就是修改 delphi rtl 核心代码。在备份原文件后 ,将 source/rtl/sys/system.pas 中所有的 lock 替换为 {lock},当然必须是整字替换。
如此还未完全优化 ,下一步是将 delphi4 运行库中也有的 xchg 指令去掉 ,因为该指令有隐含的 lock 前缀 ,所以必须将 system.pas 内 _lstrasg 和 _strlasg 两个过程中的 xchg edx,[eax] 替换为如下代码 :
mov ecx,[eax]
mov [eax],edx
mov edx,ecx
ok 大功告成 ,编译一下 ,覆盖 system.dcu 即可。如此其执行效率将比 delphi5 提高 6 倍 ,比 delphi4 提高 2 倍。
字符串与动态数组的线程安全 (thread safety)
在 delphi 5 以前动态数组与长字符串的操作这些非线程安全调用是由引用计数来处理其临界问题的 ,而自 delphi5 起就改为直接在一些临界指令前加 lock 指令前缀来避免这个问题。不幸的是这一修改的代价相当昂贵 ,因为在 pentium ⅱ处理器中 lock 指令相当费时 ,大概要耗费额外的 28 个指令周期来完成这一操作 ,因而整体效率至少下降一半。
解决这个问题的办法只有一个 ,那就是修改 delphi rtl 核心代码。在备份原文件后 ,将 source/rtl/sys/system.pas 中所有的 lock 替换为 {lock},当然必须是整字替换。
如此还未完全优化 ,下一步是将 delphi4 运行库中也有的 xchg 指令去掉 ,因为该指令有隐含的 lock 前缀 ,所以必须将 system.pas 内 _lstrasg 和 _strlasg 两个过程中的 xchg edx,[eax] 替换为如下代码 :
mov ecx,[eax]
mov [eax],edx
mov edx,ecx
ok 大功告成 ,编译一下 ,覆盖 system.dcu 即可。如此其执行效率将比 delphi5 提高 6 倍 ,比 delphi4 提高 2 倍。