无论如何
当需要更高的效率的时候
C还是比C++简洁
至于安全性
应该不是高强度数学运算主要考虑的方向
安全性应该在调试时解决
而不能在运行时解决
况且,只要是命令式语言总存在失败的可能
不是用C++就能避免的
只能减少这种可能,仔细的C代码也能达到这种效果
或者说C++并不比见得C高级,++而已 C++对类型检查更严格,可以更早地在代码初期发现bug;
如果仅利用C++易包装的特性,而不涉及到其华丽但有损效率的部分,如虚函数、多态等,
对效率的影响几乎微乎其微的,当然前提是取决于开发者的代码质量。 gxqcn说的也不是没有道理。不过如果我们查看现在一般存在的各种追求效率项目,通常核心部分都是用C些的,然后在外面加上C++的包装。C++的严格类型检查可以帮助没有经验的用户更加方便的使用软件,而C可以用来开发更加有效率的软件。
不过qxqcn说的不错,如果不使用虚函数,多态等,对效率影响是微乎其微的。其实现在很多人开发过程都非常类似,就是用C++写类似C格式的代码。
不过我还是觉得核心应该用C写更加好,毕竟C++函数从库文件里面输出不是很好的习惯,跨编译器可能会带来问题 :)
套用流行术语
多层架构
汇编--C语言--C++语言--ActiveX或者DLL 我个人比较赞同mathe的观点。 测试4核*** 被乘数与乘数长度之比为:1 ***
现在计算长度(bits): 256
GMP 包计算时间(us):0.529
HugeCalc包计算时间(us):0.429
现在计算长度(bits): 512
GMP 包计算时间(us):0.709
HugeCalc包计算时间(us):1.169
现在计算长度(bits): 1024
GMP 包计算时间(us):2.356
HugeCalc包计算时间(us):3.419
现在计算长度(bits): 1536
GMP 包计算时间(us):3.966
HugeCalc包计算时间(us):6.869
现在计算长度(bits): 2048
GMP 包计算时间(us):7.573
HugeCalc包计算时间(us):11.773
现在计算长度(bits): 3072
GMP 包计算时间(us):12.634
HugeCalc包计算时间(us):30.105
现在计算长度(bits): 4096
GMP 包计算时间(us):23.766
HugeCalc包计算时间(us):45.744
现在计算长度(bits): 8192
GMP 包计算时间(us):68.002
HugeCalc包计算时间(us):175.137
现在计算长度(bits): 10240
GMP 包计算时间(us):119.289
HugeCalc包计算时间(us):276.571
现在计算长度(bits): 16384
GMP 包计算时间(us):250.870
HugeCalc包计算时间(us):602.032
现在计算长度(bits): 64000
GMP 包计算时间(us):1556.064
HugeCalc包计算时间(us):4853.969
现在计算长度(bits): 65536
GMP 包计算时间(us):1614.730
HugeCalc包计算时间(us):4726.858
现在计算长度(bits): 256000
GMP 包计算时间(us):8891.074
HugeCalc包计算时间(us):7878.376
现在计算长度(bits): 512000
GMP 包计算时间(us):19552.206
HugeCalc包计算时间(us):13203.075
现在计算长度(bits): 1048576
GMP 包计算时间(us):44776.920
HugeCalc包计算时间(us):24991.444
现在计算长度(bits): 33554432
GMP 包计算时间(us):2635778.011
HugeCalc包计算时间(us):1115918.364
现在计算长度(bits): 67108864
GMP 包计算时间(us):6014331.151
HugeCalc包计算时间(us):1972429.736
现在计算长度(bits): 100663296
GMP 包计算时间(us):8599599.111
HugeCalc包计算时间(us):2948877.860
请按任意键继续. . .
*** 被乘数与乘数长度之比为:10 ***
现在计算长度(bits): 256
GMP 包计算时间(us):0.044
HugeCalc包计算时间(us):0.266
现在计算长度(bits): 512
GMP 包计算时间(us):0.126
HugeCalc包计算时间(us):0.318
现在计算长度(bits): 1024
GMP 包计算时间(us):0.387
HugeCalc包计算时间(us):0.585
现在计算长度(bits): 1536
GMP 包计算时间(us):0.683
HugeCalc包计算时间(us):1.003
现在计算长度(bits): 2048
GMP 包计算时间(us):1.151
HugeCalc包计算时间(us):1.597
现在计算长度(bits): 3072
GMP 包计算时间(us):2.639
HugeCalc包计算时间(us):3.092
现在计算长度(bits): 4096
GMP 包计算时间(us):3.494
HugeCalc包计算时间(us):5.956
现在计算长度(bits): 8192
GMP 包计算时间(us):17.420
HugeCalc包计算时间(us):19.828
现在计算长度(bits): 10240
GMP 包计算时间(us):36.317
HugeCalc包计算时间(us):39.670
现在计算长度(bits): 16384
GMP 包计算时间(us):64.254
HugeCalc包计算时间(us):132.419
现在计算长度(bits): 64000
GMP 包计算时间(us):515.708
HugeCalc包计算时间(us):4764.293
现在计算长度(bits): 65536
GMP 包计算时间(us):536.660
HugeCalc包计算时间(us):4800.331
现在计算长度(bits): 256000
GMP 包计算时间(us):3766.959
HugeCalc包计算时间(us):5269.944
现在计算长度(bits): 512000
GMP 包计算时间(us):11068.725
HugeCalc包计算时间(us):6354.718
现在计算长度(bits): 1048576
GMP 包计算时间(us):32993.579
HugeCalc包计算时间(us):8881.855
现在计算长度(bits): 33554432
GMP 包计算时间(us):1312180.459
HugeCalc包计算时间(us):344739.904
现在计算长度(bits): 67108864
GMP 包计算时间(us):2920021.399
HugeCalc包计算时间(us):659620.706
现在计算长度(bits): 100663296
GMP 包计算时间(us):4192419.428
HugeCalc包计算时间(us):1119119.609
请按任意键继续. . .
谢谢楼上的测试!
以最后四组数据计算,HugeCalc 与 GMP 的效率比依次为:3.715、3.806、4.427、3.746可看出 HugeCalc 还是非常充分地发挥了四核的功用。
在小规模计算上,HugeCalc暂输于GMP,
但达到一定规模后,HugeCalc会采用高级算法,且自动运用多核技术,从而远超GMP,
根据80/20原则,HugeCalc当前的侧重点取舍是非常成功的!
感谢 风云剑 朋友的测试结果,这是我首次看到的真正四核上的测试对比数据,谢谢!
另外,想请 风云剑 朋友再帮忙测试一下,大数阶乘使用不同核数时的效率,以全面测试HugeCalc对多核的支持程度,
具体参见:200秒,可以做什么?——测测你的电脑精确计算能力 我的基为$2^30$的大数乘法已经完成(仅仅实现了硬乘法,kara 乘尚未实现),测试表明,在PIV2.6,MMX的版本大幅领先GMP,下面给出测试和数据。
说明:GMP 使用mathe在csdn发布的动态链接库。运行时间均为毫秒。
Bits coount
_BIN_BaseMul_ALU(A)
_BIN_BaseMul_MMX(B)
GMP( C )
速度比(B/C)
60
0.00003522
0.00003522
0.0000594
1.686542120
0.00009646
0.00009646
0.00008316
0.862119180
0.00021972
0.00009264
0.00012834
1.385363240
0.00035905
0.00011907
0.00019499
1.637608300
0.00052825
0.00016233
0.0002728
1.680527360
0.00073955
0.00020904
0.00035653
1.705559420
0.0009853
0.00049755
0.00045363
0.911727480
0.00126933
0.00047479
0.00052395
1.103541720
0.00345908
0.00182676
0.00133954
0.733287960
0.00629495
0.00427053
0.00213323
0.4995231200
0.0098053
0.00611545
0.00324155
0.5300591440
0.0141623
0.00898395
0.00427993
0.4763971680
0.01946671
0.01195095
0.00565448
0.4731411920
0.02569357
0.01597912
0.00693922
0.434268
分析:
可以看到当乘数长度720bit时,我的版本速度将慢于GMP,这是因为当乘数长度较长时,GMP使用 kara_mul, 而我的2个版本都是basecase乘法所致。 :)
你换我在本论坛发布的dll再测下
=======================
GMP分界点是23*32Bit 据我先前的测试,这两个GMP的DLL性能相差无几,
但也可能在某些小规模的计算上存在较大差异。
liangbch 与 无心人 在优化方面作了大量工作,
而这些工作,包括测试等是非常耗神的。
顺带请教一下:64bit下的GMP可曾用到MMX、SIMD系列指令?