我听说有英特尔在线书籍描述了特定汇编指令所需的CPU周期,但我无法找到它(经过努力).有人能告诉我如何找到CPU周期吗?
下面是一个例子,在下面的代码中,mov/lock是1个CPU周期,xchg是3个CPU周期.
// This part is Platform dependent!
#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* pTargetAddress,
int nValue)
{
__asm
{
mov edx, dword ptr [pTargetAddress]
mov eax, nValue
lock xchg eax, dword ptr [edx]
}
// mov = 1 CPU cycle
// lock = 1 CPU cycle
// xchg = 3 CPU cycles
}
#endif // WIN32
Run Code Online (Sandbox Code Playgroud)
顺便说一句:这是我发布的代码的URL:http://www.codeproject.com/KB/threads/spinlocks.aspx
有什么区别
int size = (int)((length * 200L) / 100L); // (1)
Run Code Online (Sandbox Code Playgroud)
和
int size = length << 1; // (2)
Run Code Online (Sandbox Code Playgroud)
(两种情况下长度均为int)
我假设两个代码片段都想要加倍长度参数.
我很想使用(2)......那么使用(1)有什么好处吗?我查看溢出发生时的边缘情况,两个版本似乎都有相同的行为.
请告诉我我错过了什么.
在/O2(发布)模式下查看由Visual Studio(2015U2)生成的程序集时,我看到这个"手动优化"的C代码被转换回乘法:
int64_t calc(int64_t a) {
return (a << 6) + (a << 16) - a;
}
Run Code Online (Sandbox Code Playgroud)
部件:
imul rdx,qword ptr [a],1003Fh
Run Code Online (Sandbox Code Playgroud)
所以我想知道这是否真的比按照它的编写方式更快,类似于:
mov rbx,qword ptr [a]
mov rax,rbx
shl rax,6
mov rcx,rbx
shl rcx,10h
add rax,rcx
sub rax,rbx
Run Code Online (Sandbox Code Playgroud)
我总是觉得乘法总是比几个班次/加法慢?现代英特尔x86_64处理器不再是这种情况吗?
我正在看一些关于算法的讲座,教授用乘法作为如何改进朴素算法的例子......
它让我意识到乘法并不是那么明显,虽然在我编码时我只是认为它是一个简单的原子操作,乘法需要一个算法来运行,它不像对数字求和那样工作。
所以我想知道,现代桌面处理器实际使用什么算法?我猜他们不依赖对数表,也不用数以千计的总和进行循环......
据我了解,乘法的复杂度顺序是二次的,因此,如果将两个1位数字相乘将有1个运算,两个2位数字相加将有4个运算,两个3位数字9个运算等等上。
我想通过定时执行将两个数字相乘的程序来查看这种复杂性。出乎意料的是,无论数字的大小如何,执行时间都是相同的。
import time
num1 = 135
num2 = 342
start = time.time()
total = num1 * num2
finish = time.time()
elapsed = finish - start
print elapsed
Run Code Online (Sandbox Code Playgroud)
因此,结果是9.53674316406e-07我将两个3位数或两个30位数相乘。
我误会什么?