Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: jlflyfox   发起时间: 2013-01-24 16:21 下午   回复: 6

Print Search
帖子排序:    
   2013-01-24, 16:21 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

我发现我的一个算法程序在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,就想有个编译器,哈哈。

谢谢啊!


IP 地址: 已记录   报告
   2013-01-24, 17:17 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

1, 做内核调用或者分发异常时,需要经过WoW转接层(http://advdbg.org/blogs/advdbg_system/articles/5495.aspx);访问某些文件和注册表会被virtualize;会有点影响,但一般不会导致明显的差异

2,也可以尝试WPA(xPerf) ,不过没有VTune强大

3,用WinDBG 64位就看到了

4,Visual Studio Express ??


IP 地址: 已记录   报告
   2013-01-24, 23:01 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: 请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

谢谢!

我考虑到了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;
}


IP 地址: 已记录   报告
   2013-01-25, 13:23 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

执行这段代码时,会导致很多个page fault,所以速度就与访问磁盘上的虚拟内存文件关系很大。

是在同一台机器(双系统)上做测试么?

建议禁止高速缓存(pagefile)再试验一次

 


IP 地址: 已记录   报告
   2013-01-28, 15:06 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: 请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

是不同机器,但物理配置是一样的。

先禁止了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;
}


IP 地址: 已记录   报告
   2013-01-28, 21:17 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

相差的数量在什么级别?

 


IP 地址: 已记录   报告
   2013-01-29, 17:58 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: 请问张老师和各位高手一个64位跑32位程序的问题
Reply Quote

可能不是线形的

windows2003上跑32位的程序,TestSimple函数需要0.83s--0.85s左右,跑了超过10次都如此

windows2008跑32位程序,TestSimple函数需要1.2s--1.3s左右

在windows2008那里,有的时候还不够稳定,有点测不准感觉

 


IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: 请问张老师和各位高手一个64位跑32位程序的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.