速度优化的问题(50分)

  • 主题发起人 主题发起人 modula-2
  • 开始时间 开始时间
M

modula-2

Unregistered / Unconfirmed
GUEST, unregistred user!
str:string;
str[n]是一个字符char
而我想得到ord(char)
这样就要ord(str[n])
但是在内存中实际存的就是char的ascii码,这样我就转换了两次,
而实际不需转,
好像c中str[n]可以直接当byte用。
如果str有几十M就很不优化,有没有好的办法?
 
嵌入汇编?
 
Byte(str[n])
 
C中没有string类型;它都是用的pchar()来处理的~~

像楼上的那样 Byte(str[n])~这样的转化就行啊~~
 
Byte(str[n]) 不会调用一个函数吧,我希望的是编译器直接译成一两条汇编代码。
就像inc(a)一样,不是函数,这样才快。
 
byte()是强制类型转换吧,是不是比ord快
 
强制类型转换要比函数转换要快,因为它不是一个“函数”,而是一个类似编译指令那样的编译期行为,它的作用是“告诉”编译器,把某个数据量当作是指定的数据类型来处理。这样实际上就跟C里面把字符型数据当作是整型数据来用是一样的道理。
 
多谢韦剑,完全正解,
我以前的代码是这样:
str := ord(CharCode);
现在:
byte(str) := CharCode

直接就搞定了。
再次感谢。
 
对于modula-2的问题,强制转换不是最快的,用指针才快。
做过测试,第一个循环比第二循环快1倍以上。
CPU: CD315 2G,200M的数据。第一个循环用时0.20秒,第二个循环用时0.57秒。
-----------
s:string;
pb:^byte;
pb:=@s[1];
for i:=1 to Length(s) do
begin
pb^:=1;
end;

for i:=1 to Length(s) do
begin
byte(s):=1;
end;
 
qqjm有理,指针是直接操作内存,效率更高。
下面看看其汇编代码:
pb^:=1;编译后是一句,仅mov操作:
mov byte ptr [ebx],$01
而byte(s):=1
编译后有两句代码:
mov ecx ,[ebp-$04]
mov byte ptr [ecx+edx-$01],$01
 
真是山外青山楼外楼啊
 
真是山外青山楼外楼啊,不过我已经满足了,毕竟只有两句汇编,比调函数push pop快多了。
 
呵呵,搞错了,每一个循环应该是这样写
for i:=1 to Length(s) do
begin
pb^:=1;
inc(pb);
end;
200M用时0.31秒
 
深奥,学习中。
请问如果数据库编程中,有必要用到这方面的知识吗?
 
to qqjm:没事我知道你打漏了一个inc,知道思想就行。
to 楼上:这个难说,数据库的存取好像不用这些东西。不过这些东西是基础,
我的基础太差了,在这儿学到不少。
 
后退
顶部