DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: gabor423
今日帖子: 50
在线用户: 18
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 liang1zhou (Mark zql) ▲▲▲▲▲ -
注册会员
2013/5/6 14:04:18
标题:
Delphi 64位编译出来的性能反而降低,到底是闹什么。。。。。 浏览:2879
加入我的收藏
楼主: 写了一个程序,分别编译成 64位 跟 32位,发个图,大家看下运行时间
var
  str:string;
  time,i,total:Integer;
begin
  time := GetTickCount;
  for I := 1 to 1000000 do
  begin
    str := str +'1';
  end;
  time := GetTickCount - time;
  Memo1.Lines.Add(IntToStr(time) );
附件有比较图片1
此帖子包含附件:
JPEG 图像
大小:23.0K
----------------------------------------------
-
作者:
男 liang1zhou (Mark zql) ▲▲▲▲▲ -
注册会员
2013/5/6 14:09:47
1楼: 同样的程序用c# 64位写出来的性能比delphi高很多
此帖子包含附件:
JPEG 图像
大小:12.3K
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2013/5/6 14:51:36
2楼: 1、你这个例子考察的只是内存管理器而已 ~~~
2、x64 只是更大的寻址而已,和性能没有直接关系!
----------------------------------------------
-
作者:
男 yagzh (心不了情) ★☆☆☆☆ -
盒子活跃会员
2013/5/6 14:59:35
3楼: 刚刚测试了你的代码,delphi和C#都差不多,改变一点的是用到了stringbuilder,不知你的c#中是不是用StringBuilder,如果你在C#中也用String,哈哈,那C#晕倒了。

在C#中用String类型寻址时间很长的
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2013/5/6 15:16:50
4楼: 你真的确定C#效率高?
var
  str:string;
  time,i,total:Integer;
begin
  time := GetTickCount;
  for I := 1 to 1000000 do
  begin
    str := str +'1';
  end;
  time := GetTickCount - time;
  Memo1.Lines.Add(IntToStr(time) );

end;

using System.Runtime.InteropServices;
        [DllImport("kernel32")]
        static extern uint GetTickCount();

        private void button1_Click(object sender, EventArgs e)
        {
          string s = "";
          uint time = GetTickCount();
          for (int i = 0; i < 1000000; i++)
          {
          s = s + "1";
          }
          time = GetTickCount() - time;
          textBox1.Text = textBox1.Text + "\n\r" + time.ToString();

        }
我执行Delphi只要15ms,C#等了5分钟都没结果.
这种情况除非C#用StringBuilder会稍稍快一点.
        private void button1_Click(object sender, EventArgs e)
        {
          string s = "";
          StringBuilder sb = new StringBuilder();
          uint time = GetTickCount();
          for (int i = 0; i < 1000000; i++)
          {
          sb.Append("1");
          }
          s = sb.ToString();
          time = GetTickCount() - time;
          textBox1.Text = textBox1.Text + "\n\r" + time.ToString();

        }
这种情况也要31毫秒.慢于Delphi的15毫秒.
我用高版本Delphi也有StringBuilder.
var
  str:string;
  sb : TStringBuilder;
  time,i,total:Integer;
begin
  sb := TStringBuilder.Create;
  time := GetTickCount;
  for I := 1 to 1000000 do
  begin
    //str := str +'1';
    sb.Append('l');
  end;
  str := sb.ToString;
  time := GetTickCount - time;
  Memo1.Lines.Add(IntToStr(time) );
  sb.Free;
end;
结果是0毫秒.也就是小于一个线程轮询周期.至少10ms内就结束了.


回到正题,64位也不是处处都比32位快.如果是大批量数据做位运算,如加解密算法等.32位处理器一次处理4字节,64位处理器一次处理8字节会快很多.另外内存拷贝是寄存器搬运数据也会快很多.

也有极限的时候甚至64位会比32位要慢的情况.
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2013/5/6 15:26:32
5楼: 64位系统只是内存寻址能力比32位系统强.
二进制操作的话,按照楼上说的,应该也会强一些.
----------------------------------------------
作者:
男 liang1zhou (Mark zql) ▲▲▲▲▲ -
注册会员
2013/5/6 16:39:28
6楼: 感谢各位大神!

1.据我测试,为啥c#64位编译出来跟32位运行速度差距很大,delphi 32跟64几乎没啥区别,不管是string相加,还是int类型的相加
2.我同样都用stringbuilder 测试下c#64位跟delphi64位,还是delphi落下风。。
3.我用一段加密解密的程序,循环10000次,测试下delphi 32 跟64,结果是用的时间64位的多。
正在纠结在64位系统用64位编译还是32位编译,求大神指点!!谢谢
for I := 1 to 10000 do
  begin
    str:= EncryptString('11111111221111111111','12345678');
    str := UnEncryptString(str,'12345678');
  end;
----------------------------------------------
-
作者:
男 liang1zhou (Mark zql) ▲▲▲▲▲ -
注册会员
2013/5/6 16:59:32
7楼: 我大概明白了,32位跟64位程序区别应该是寻址大小,但是delphi编译出64跟32的运算上存在差距,应该是32编译器跟64 的不一样的原因吧!64的编译器没32的好!
----------------------------------------------
-
作者:
男 sdssoft (sds) ★☆☆☆☆ -
盒子活跃会员
2013/5/6 23:23:34
8楼: 64位大部分代码是Pure Pascal,而32位大部分代码是asm,所以你会感觉到32位快。
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2013/5/7 0:33:23
9楼: dcc64 确实比不上 dcc32,emb 也就这点人啊,还是看 llvm 的吧,8 过之前问过 李维,他说对于已有的 32、64 不可能再基于 llvm 了,emb 后面野心很大,c++ x64 是第一个,然后是 ios、android、winrt、linux、...
----------------------------------------------
-
作者:
男 lsu (lsu) ★☆☆☆☆ -
普通会员
2013/5/7 7:42:28
10楼: 从编译器角度讲,处理技术大家都会采用最快速的技巧。

速度差异只能在于内存动态分配和一次性分配的机制上。这点delphi不可能学C#,他必须逐次申请空间并作一系列辅助工作。delphi的字符串处理能力是其一大特色,应该说是delphi语言的闪光点之一。这样极限测试没有意义,任何语言而言,如果需要这样大的字符串以及频繁处理规模,就要考虑其他模式,以提高效率。

就像安卓手机,平常使用绝对不至于发热到烫手,你要是跑测试软件连续两个小时,那个温度你都没法拿了,你能说这手机不行?

64位反而慢,这个是实情。不像宣传的那样。问题出在intel还是微软,还是商业竞争炒作,夸大宣传,自己思考。cpu是很快,但是内存操作这些年硬件技术进步不大。CPU直接控制内存性能就一定好于北桥?这种测试,恐怕只是反映了各位电脑内存性能以及CPU操控内存的带宽而已。更改下bios设置,恐怕测试成绩会不一样。
----------------------------------------------
-
作者:
男 zhoutler (苦行僧) ★☆☆☆☆ -
普通会员
2013/5/7 8:19:28
11楼: 楼主,无论delphi,c#,string类型都是常量,delphi对string稍微优化了点,C#像这么用string类型,会把编译器累到滴。
你这个代码是让编译器不断的申请内存,释放内存,循环了n次。因为string类型的变量值不可变,是固定的。
----------------------------------------------
-
作者:
男 a5824 (Return) ▲▲▲▲△ -
注册会员
2013/5/7 9:14:29
12楼: 都是大牛,晚辈前来学习!
----------------------------------------------
-
作者:
男 hexi (Hexi) ★☆☆☆☆ -
盒子活跃会员
2013/5/7 11:36:57
13楼: Delphi 64Bits的字符串函数都是Pascal写的,而32Bits大部分字符处理函数改为汇编了。
等n个版本后的Delphi估计才会有64Bits汇编和ARM汇编吧。

如果是大量的添加字符,可以用这样的方法:
var
  str:string;
  time,i,total:Integer;
begin
  SetLength(str, 1000000);
  time := GetTickCount;
  for I := 1 to 1000000 do
  begin
    str[i] := '1';
  end;
  time := GetTickCount - time;
  Memo1.Lines.Add(IntToStr(time) );

end;
----------------------------------------------
-
作者:
男 lsu (lsu) ★☆☆☆☆ -
普通会员
2013/5/7 16:11:53
14楼: C#快,就在于采用了13#这样的操作。

预先给串分配一大的空间,不超过此空间的操作,就这样直接处理,非常快。

一旦超过空间长度,才会加倍申请一次空间,然后继续这样操作。

分配空间的次数减少,运算操作时间变短。

delphi是每一次操作都要分配新的够用的空间,整理一番,才完成操作,看起来耗时大。

应该学学C#这种批发式的内存申请模式。现在的内存大了,不必节省着用拖累性能。
----------------------------------------------
-
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2013/5/8 18:04:59
15楼: 楼主可以使用13楼的方法测试一下Delphi32和64位版本,再与C#比较。我测试Delphi速度提高很多,但是手头上没有C#编译器,所以请楼主测试一下。
----------------------------------------------
作者:
男 nihao500s (nihao100s) ▲△△△△ -
注册会员
2019/5/22 16:03:53
16楼: 北京私家侦探
上海搬家公司
私家侦探
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2019/5/23 14:38:46
17楼: 要看场景

https://helloacm.com/c-coding-exercise-count-primes
此帖子包含附件:
JPEG 图像
大小:69.8K
----------------------------------------------
Delphi4Linux交流群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 smartdata (smartdata) ★☆☆☆☆ -
普通会员
2019/5/23 17:33:05
18楼: 用C++Builder编译项目,由于用到大量运算(100万次+)以及内存的频繁操作,目前64位确实比32位来得慢点,编译器也许是比较主要的原因,CPU、RAM和Windows在64位和32位时的效率是否也存在差异?大家进一步分析一下。
----------------------------------------------
==========
作者:
男 thinkspace (JoJo) ▲▲▲▲▲ -
注册会员
2019/5/24 13:32:45
19楼: 我对高性能编程稍有点研究,Delphi内存管理这个问题跟默认的FastMM内存管理器有关,在64bit下它的性能相当糟糕,比Windows内置的Heap内存管理还要差。

简单的解决办法,换用高性能的内存管理器,比如BrainMM

按此在新窗口浏览图片

https://github.com/d-mozulyov/BrainMM

BrainMM有一点兼容性问题,不过只使用Delphi的情况下并无太大影响。

进阶方案,使用ASMLib

这是处理器大牛Agner做的,纯汇编的内存复制/移动和字符串操作,支持各种现代CPU,本身是为C/C++做的,改一改也可以在Delphi中用。

https://www.agner.org/optimize/

这里还有很多资料和库,有需要可以自行研究
----------------------------------------------
-
作者:
男 thinkspace (JoJo) ▲▲▲▲▲ -
注册会员
2019/5/24 13:44:46
20楼: 再进一步就需要用到混合编程了,无论如何算法和内存操作都是汇编和C语言最快,可以将核心算法编译成DLL供Delphi程序调用,或者编译成obj进行静态链接。

更进一步使用面向处理器的向量指令加速,这大约是Win32下最强的手段了。

还不够?那就得编写驱动进入内核模式进行内存管理了,可以使用特权指令(比如禁用中断),可以使用物理内存寻址等等,当然这种做法难度相当大了。

至于delphi程序本身的性能那就是次要的了,用它主要就是做界面。
----------------------------------------------
-
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2019/5/24 15:59:08
21楼: 1、谁说64位更快的?应该是与问题相关的。
2、测试程序考虑编译器优化没有?
----------------------------------------------
-
作者:
男 thinkspace (JoJo) ▲▲▲▲▲ -
注册会员
2019/5/25 1:44:18
22楼: 不说其它系统,只说在Windows 64,当然是64位程序更快。

32位程序需要通过WOW64执行,需要经过API thunk,以及额外的内存开销,每个32位线程在64位系统下运行时会额外分配一个512kb的堆栈(用于真实的64bit调用)。

如果原生64bit比wow64还慢,说明代码没写好,或者编译器优化不够。
----------------------------------------------
-
作者:
男 thinkspace (JoJo) ▲▲▲▲▲ -
注册会员
2019/5/25 1:47:36
23楼: 至于楼主的问题,这个锅只能delphi背了,delphi的编译器进展太缓慢(或者说停滞),到如今都不支持新的指令集,还停留在SSE2,落后时代20年。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行66.40625毫秒 RSS