我发现我的一个算法程序在32位下用vc2010编译好了后,
在同样cpu4G内存配置情况下,分别32位的windows2003上运行和64位的windows2008运行有些奇怪,就是在32位的windows2003上运行更快,
我的程序排除了文件网络等I/O操作。
我是用intel的工具vtune来测试的,我想问以下几个问题:
1、是不是从理论上来说,64位下运行32位程序肯定要慢点,因为cpu的扩展导致64位下运行32位指令集需要仿真类似
2、我用vtune来测试的,能否用windbg来测试性能,或者有其它更好的工具,找遍了《软件调试》没有发现相关内容
3、我在64位下用64位的windbg调试这个32位程序,怎么看到的还是32位指令集啊
4、微软怎么不免费提供下64位的编译器啊,不要IDE,就想有个编译器,哈哈。
谢谢啊!
1, 做内核调用或者分发异常时,需要经过WoW转接层(http://advdbg.org/blogs/advdbg_system/articles/5495.aspx);访问某些文件和注册表会被virtualize;会有点影响,但一般不会导致明显的差异
2,也可以尝试WPA(xPerf) ,不过没有VTune强大
3,用WinDBG 64位就看到了
4,Visual Studio Express ??
谢谢!
我考虑到了WOW和文件访问这些,我都抽取出来了的,我专门测试如下简单程序,用release版本,在windows2003下比windows2008上快70%左右。
TestSimple(1024 * 1024 * 100);
int TestSimple(int num){ int i = 0; int k = 1; int j = 2; int ret = 0; int *a = new int[num]; int *b = new int[num]; int *c = new int[num]; for (int ii = 0; ii < num; ii ++) { int ik = i * num + k; int jk = k * num + j; a[ii] = ik; b[ii] = jk; c[ii] = a[ii] * b[ii]; ret = c[ii] + ret; } return ret;}
执行这段代码时,会导致很多个page fault,所以速度就与访问磁盘上的虚拟内存文件关系很大。
是在同一台机器(双系统)上做测试么?
建议禁止高速缓存(pagefile)再试验一次
是不同机器,但物理配置是一样的。
先禁止了pagefile,发现的确有所改善,但仍然是windows2003下更快。
今天在2008上装了一个vs2010,编译出64位的程序,发现如下现象
windows2003 32位程序速度最快,
windows2008 64位程序速度中间,
windows2008 32位程序速度最慢。
为了排除内存预定提交以及缺页交换这些问题,我把程序修改了下
#define NUM 1024 * 1024 * 10
int *a = 0; int *b = 0; int *c = 0;int TestSimple(int num){ int i = 0; int k = 1; int j = 2; int ret = 0; for (int count = 0; count < 30; count ++) { for (int ii = 0; ii < num; ii ++) { int ik = i * num + k; int jk = k * num + j; a[ii] = ik; b[ii] = jk; c[ii] = a[ii] * b[ii]; ret = c[ii] + ret; } } return ret;}int TestInit(){ a = new int[NUM]; b = new int[NUM]; c = new int[NUM]; for (int i = 0; i < 1024 * 10; i ++) { a[i * 1024] = 0; b[i * 1024] = 0; c[i * 1024] = 0; } return 0;}
int _tmain(int argc, char* argv[]){ printf("Hello World!\n"); TestInit(); int aa = TestSimple(NUM); printf("aa %d\n", aa); return 0;}
相差的数量在什么级别?
可能不是线形的
windows2003上跑32位的程序,TestSimple函数需要0.83s--0.85s左右,跑了超过10次都如此
windows2008跑32位程序,TestSimple函数需要1.2s--1.3s左右
在windows2008那里,有的时候还不够稳定,有点测不准感觉