关于乘法指令与加法指令哪个快的有关问题解答
关于乘法指令与加法指令哪个快的问题解答
http://sj256.com/content/?62.html
------解决方案--------------------
------解决方案--------------------
还是看对应的汇编代码吧。
------解决方案--------------------
帮顶。。。。从题目来看没有可比性
------解决方案--------------------
查一下cpu的指令手册就有了。
add
Clocks Size
Operands 808x 286 386 486 Bytes
reg,reg 3 2 2 1 2
mem,reg 16+EA 7 7 3 2-4 (W88=24+EA)
reg,mem 9+EA 7 6 2 2-4 (W88=13+EA)
reg,immed 4 3 2 1 3-4
mem,immed 17+EA 7 7 3 3-6 (W88=23+EA)
accum,immed 4 3 2 1 2-3
mul
Clocks Size
Operands 808x 286 386 486 Bytes
reg8 70-77 13 9-14 13-18 2
reg16 118-113 21 9-22 13-26 2
reg32 - - 9-38 13-42 2-4
mem8 (76-83)+EA 16 12-17 13-18 2-4
mem16 (124-139)+EA 24 12-25 13-26 2-4
mem32 - - 12-21 13-42 2-4
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
‘任何一个非0数乘0’的速度都应该比‘两个非0数相加’快吧。(^_^)
------解决方案--------------------
上代码(gcc x86-64, -O3 优化):
http://sj256.com/content/?62.html
------解决方案--------------------
------解决方案--------------------
还是看对应的汇编代码吧。
------解决方案--------------------
帮顶。。。。从题目来看没有可比性
------解决方案--------------------
查一下cpu的指令手册就有了。
add
Clocks Size
Operands 808x 286 386 486 Bytes
reg,reg 3 2 2 1 2
mem,reg 16+EA 7 7 3 2-4 (W88=24+EA)
reg,mem 9+EA 7 6 2 2-4 (W88=13+EA)
reg,immed 4 3 2 1 3-4
mem,immed 17+EA 7 7 3 3-6 (W88=23+EA)
accum,immed 4 3 2 1 2-3
mul
Clocks Size
Operands 808x 286 386 486 Bytes
reg8 70-77 13 9-14 13-18 2
reg16 118-113 21 9-22 13-26 2
reg32 - - 9-38 13-42 2-4
mem8 (76-83)+EA 16 12-17 13-18 2-4
mem16 (124-139)+EA 24 12-25 13-26 2-4
mem32 - - 12-21 13-42 2-4
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
‘任何一个非0数乘0’的速度都应该比‘两个非0数相加’快吧。(^_^)
------解决方案--------------------
上代码(gcc x86-64, -O3 优化):
- C/C++ code
#include <cstdio> #include <stdint.h> using namespace std; uint64_t rdtsc() { uint32_t eax, edx; asm volatile ("rdtsc" : "=a"(eax), "=d"(edx)); return ((uint64_t)edx << 32) | eax; } int main() { uint64_t start, end; start = rdtsc(); for(int i = 0; i < 100000000; ++i) { asm volatile ("imul %0, %%eax" : : "r"(0) : "eax"); asm volatile ("imul %0, %%ebx" : : "r"(0) : "ebx"); asm volatile ("imul %0, %%ecx" : : "r"(0) : "ecx"); asm volatile ("imul %0, %%edx" : : "r"(0) : "edx"); asm volatile ("imul %0, %%eax" : : "r"(0) : "eax"); asm volatile ("imul %0, %%ebx" : : "r"(0) : "ebx"); asm volatile ("imul %0, %%ecx" : : "r"(0) : "ecx"); asm volatile ("imul %0, %%edx" : : "r"(0) : "edx"); asm volatile ("imul %0, %%eax" : : "r"(0) : "eax"); asm volatile ("imul %0, %%ebx" : : "r"(0) : "ebx"); asm volatile ("imul %0, %%ecx" : : "r"(0) : "ecx"); asm volatile ("imul %0, %%edx" : : "r"(0) : "edx"); } end = rdtsc(); printf("ticks: %lu\n", (unsigned long)(end - start)); start = rdtsc(); for(int i = 0; i < 100000000; ++i) { asm volatile ("imul %0, %%eax" : : "r"(0x55555555) : "eax"); asm volatile ("imul %0, %%ebx" : : "r"(0x55555555) : "ebx"); asm volatile ("imul %0, %%ecx" : : "r"(0x55555555) : "ecx"); asm volatile ("imul %0, %%edx" : : "r"(0x55555555) : "edx"); asm volatile ("imul %0, %%eax" : : "r"(0x55555555) : "eax"); asm volatile ("imul %0, %%ebx" : : "r"(0x55555555) : "ebx"); asm volatile ("imul %0, %%ecx" : : "r"(0x55555555) : "ecx"); asm volatile ("imul %0, %%edx" : : "r"(0x55555555) : "edx"); asm volatile ("imul %0, %%eax" : : "r"(0x55555555) : "eax"); asm volatile ("imul %0, %%ebx" : : "r"(0x55555555) : "ebx"); asm volatile ("imul %0, %%ecx" : : "r"(0x55555555) : "ecx"); asm volatile ("imul %0, %%edx" : : "r"(0x55555555) : "edx"); } end = rdtsc(); printf("ticks: %lu\n", (unsigned long)(end - start)); return 0; }