我是一名电路设计师(不是软件向导),过去9个月一直致力于数值算法.作为评估算法有效性的一种方法,我会监控收敛解决方案所需的时间.
大约6个月前,我发现我声明变量的方式会对程序运行所需的时间产生巨大影响.例如,简单地重新排列声明(如下所示)可以使运行代码所需的时间加倍.简单地改变阵列的长度也会同样影响问题.
int N, j, Iter;
long double RealZero, RealErr, QuadIterErr, QuadX;
long double TUV[3], QuadQP[102], RealQP[102];
bool Updated;
int N, j, Iter;
long double RealZero, RealErr, QuadIterErr, QuadX;
long double QuadQP[102], RealQP[102];
bool Updated;
long double TUV[3];
Run Code Online (Sandbox Code Playgroud)
我最初认为我有某种错误,但我找不到它.除了速度之外,我没有看到任何其他异常,无论代码运行缓慢还是快速,我都得到相同的结果.
我找到了一些与包装长双打有关的问题的讨论,但我不理解任何一个,他们从未说过如何解决他们正在讨论的问题.
有人可以给我一些关于这里可能会发生什么以及如何解决它的见解?
我需要的是一致性而不是我需要的速度.我没有使用任何速度优化器(默认编译器设置),我使用的是C++ Builder XE3.我没有使用#pragma pack(正如有人问的那样).
根据注释,我设置了慢速和快速执行的声明,并比较了所有长双变量的基址.无论是慢速还是快速,地址都以0,4,8或C结尾.
user5108_Dan 说:
关于优化器,我的意思是我只是使用默认的编译器设置。我可以更改任何数组长度并影响速度,或者我可以添加虚拟变量来影响速度。
这很可能是你的问题。由于生产代码始终会被优化,因此不要对未优化的代码进行速度测试:您实际上将执行编译器的工作!