Q1.编写不消耗CPU但仍能获得出色性能的代码的最佳实践是什么?这个问题非常通用.我在这里寻求的是列出用于不同环境的不同实践?除了进程监视器/任务管理器之外的调试技巧
编辑:我不是在谈论IO绑定进程.我说的是CPU绑定过程.但是,在这里我不希望我的进程继续占用CPU.如果我有一台4核机器,并且如果我在一个过程中运行四个简单的循环,则CPU消耗量最多可达到400%,直到应用程序/进程运行.
我在这里寻求一些关于这个话题的经验,每个人都会遇到一些时间或其他.例如,一旦应用程序在Windows上占用CPU,我就会调试它,因为它不断循环搜索不存在的文件.
如何以两种不同的CPU绑定应用程序顺利运行(给出良好响应)的方式编写程序?
更新: 建议:
写好干净的代码,然后配置您的应用程序,然后进行优化.(感谢提示)
重写/重新设计/重构代码比分析和修复代码更容易.
使用分析器调试您的应用程序
对于长时间等待的线程,请勿使用自旋锁
算法选择
这些建议对初学者理解概念有很大帮助.
我感兴趣的是如何把它放在循环中,以便获得cpu执行每个不同操作的实时时间
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
typedef unsigned __int64 uint64;
const uint64 m1=0x5555555555555555;
const uint64 m2=0x3333333333333333;
const uint64 m4=0x0f0f0f0f0f0f0f0f;
const uint64 m8=0x00ff00ff00ff00ff;
const uint64 m16=0x0000ffff0000ffff;
const uint64 m32=0x00000000ffffffff;
const uint64 hff=0xffffffffffffffff;
const uint64 h01=0x0101010101010101;
uint64 popcount_1(uint64 x)
{
x=(x&m1)+((x>>1)&m1);
x=(x&m2)+((x>>2)&m2);
x=(x&m4)+((x>>4)&m4);
x=(x&m8)+((x>>8)&m8);
x=(x&m16)+((x>>16)&m16);
x=(x&m32)+((x>>32)&m32);
return (uint64)x;
}
//This uses fewer arithmetic operations than any other known
//implementation on machines with slow multiplication.
//It uses 17 arithmetic operations.
int popcount_2(uint64 x)
{
x-=(x>>1)&m1;//put count of each 2 bits into those …Run Code Online (Sandbox Code Playgroud) 在为神经网络库编写一些数学导数函数时,我偶然发现了一个有趣的优化问题。事实证明,与大值a / (b*c)相比a / b / c,表达式需要更长的时间来计算(见timeit下文)。但由于这两个表达式是相等的:
a / (b*c),因为它似乎是慢?提前致谢 :)
In [2]: timeit.timeit('1293579283509136012369019234623462346423623462346342635610 / (52346234623632464236234624362436234612830128521357*32189512234623462637501237)')
Out[2]: 0.2646541080002862
In [3]: timeit.timeit('1293579283509136012369019234623462346423623462346342635610 / 52346234623632464236234624362436234612830128521357 / 32189512234623462637501237')
Out[3]: 0.008390166000026511
Run Code Online (Sandbox Code Playgroud) 我正在运行一些完全为效率而构建的实现.我对这个主题还不是很有经验,并且想知道何时最好地声明变量.我的代码的以下部分特别是:
//Variables not declared in the next part are declared here (like xx, y1, x1.....)
for(s = 0; s < this.Width; s++)
{
y = ymin;
for(z = 0; z < this.Height; z++)
{
x1 = 0;
y1 = 0;
looper = 0;
while(looper < curMaxIter && Math.Sqrt((x1 * x1) + (y1 * y1)) < 2)
{
looper++;
xx = (x1 * x1) - (y1 * y1) + x;
y1 = 2 * x1 * y1 + y;
x1 = …Run Code Online (Sandbox Code Playgroud)