我为Project Euler Q14编写了这两个解决方案,在汇编和C++中.它们是用于测试Collatz猜想的相同蛮力方法.装配解决方案与组装
nasm -felf64 p14.asm && gcc p14.o -o p14
Run Code Online (Sandbox Code Playgroud)
C++是用.编译的
g++ p14.cpp -o p14
Run Code Online (Sandbox Code Playgroud)
部件, p14.asm
section .data
fmt db "%d", 10, 0
global main
extern printf
section .text
main:
mov rcx, 1000000
xor rdi, rdi ; max i
xor rsi, rsi ; i
l1:
dec rcx
xor r10, r10 ; count
mov rax, rcx
l2:
test rax, 1
jpe even
mov rbx, 3
mul rbx
inc rax
jmp c1
even:
mov rbx, 2 …Run Code Online (Sandbox Code Playgroud) 我记得在某处可以真正优化和加速代码的某些部分,程序员用汇编语言编写该部分.我的问题是 -
我正在努力理解这个概念,非常感谢任何帮助或链接.
更新:根据dbemerlin的要求改写第3点 - 因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码运行速度会慢,因为编译器通常会比大多数人更好地优化代码.
来自Ira Baxter回答,为什么INC和DEC指令不会影响进位标志(CF)?
大多数情况下,我远离
INC而DEC现在,因为他们做的部分条件代码更新,这样就可以在管道中引起滑稽的摊位,和ADD/SUB没有.因此,无关紧要(大多数地方),我使用ADD/SUB避免失速.我使用INC/DEC仅在保持代码较小的情况下,例如,适合高速缓存行,其中一个或两个指令的大小产生足够的差异.这可能是毫无意义的纳米[字面意思!] - 优化,但我在编码习惯上相当老派.
我想问一下为什么它会导致管道中的停顿,而添加不会?毕竟,无论是ADD和INC更新标志寄存器.唯一的区别是INC不更新CF.但为什么重要呢?
我想尝试使用SIMD指令编写atoi实现,包含在RapidJSON(C++ JSON 读 /写库)中.它目前在其他地方有一些SSE2和SSE4.2优化.
如果是速度增益,atoi则可以并行执行多个结果.字符串最初来自JSON数据的缓冲区,因此多atoi函数将不得不进行任何所需的调配.
我想出的算法如下:
我的目标是x86和x86-64架构.
我知道AVX2支持三个操作数Fused Multiply-Add,所以我将能够执行Sum = Number*有效数字+和.
那是我到目前为止的地方.
我的算法是否正确?有没有更好的办法?
是否有使用任何SIMD指令集的atoi参考实现?
在C++中,说:
uint64_t i;
uint64_t j;
Run Code Online (Sandbox Code Playgroud)
然后i * j将产生一个uint64_t值为i和之间的乘法的下半部分j,即(i * j) mod 2^64.现在,如果我想要乘法的较高部分怎么办?我知道在使用32位整数时,存在一个汇编指令做类似的事情,但我对汇编并不熟悉,所以我希望得到帮助.
制作以下内容的最有效方法是:
uint64_t k = mulhi(i, j);
Run Code Online (Sandbox Code Playgroud) 可能重复:
汇编程序什么时候比C快?
你好,
这纯粹是一个理论问题,因此,如果有一个"无限"时间来制作一个简单的程序,以及对C和汇编的高级知识,那么在汇编中做一些事情真的更好吗?将C编译成汇编(机器代码)时,"性能"会丢失吗?
根据性能我的意思是,现代C编译器在某些任务中做得不好,直接在Assembly中编程加速吗?
谢谢.
在 Visual C++ 中,_umul128 在面向 Windows 32 位时未定义。面向 Win32 时如何将两个无符号 64 位整数相乘?该解决方案只需要在面向 Windows 32 位的 Visual C++ 2017 上运行。
我以战地4为例,这可以用于任何游戏.
我一直想知道这样的事情是否可行:
由于BF4正在运行客户端,这意味着您拥有构成游戏的所有代码.
它在技术上是否可以反编译代码并查看它的来源?
一直到游戏的核心机制?
或者是否有某种加密保护它?
我确实意识到,如果你成功地反编译这样的东西,那将是一个混乱处理而根本没有组织,但是,嘿,它仍然是源头.
只是一些我无法找到任何其他地方的答案.
我刚刚开始学习汇编并制作一些自定义循环,用于使用C++的asm {}体交换两个变量,使用C-Free 5.0中的Digital-Mars编译器
启用-o(优化)
并得到了结果:
time of for-loop(cycles) 844
time of while-loop(cycles) 735
time of custom-loop-1(cycles) 562
time of custom-loop-2(cycles) 469
Run Code Online (Sandbox Code Playgroud)
我无法找到Digital-Mars编译器"asm output"选项进行比较.构建选项中没有其他优化选项.我应该改变我的编译器吗?如果是的话,哪一个?你能看一下下面的代码并告诉我为什么自定义循环更快?
这是循环的标准:
t1=clock();
for(int i=0;i<200000000;i++)
{
temp=a;//instruction 1
a=b;//instruction 2
b=temp;//3 instructions total
}
t2=clock();
printf("\n time of for-loop(increasing) %i \n",(t2-t1));
Run Code Online (Sandbox Code Playgroud)
这是标准的while循环:
t1=clock();
while(j<200000000)
{
temp=a;//again it is three instructions
a=b;
b=temp;
j++;
}
t2=clock();
printf("\n time of while-loop(cycles) %i \n",(t2-t1));
Run Code Online (Sandbox Code Playgroud)
这是我的自定义循环1:
t1=clock();
j=200000000;//setting the count
__asm
{
pushf //backup
push eax //backup
push ebx //backup
push ecx …Run Code Online (Sandbox Code Playgroud) 我知道现在很多编译器都非常擅长优化代码。但是,如果一个完全理解现代pc架构的人,是否有可能使代码比编译器更快?比如,如果他用 100% 的汇编编写代码,专注于架构呢?如果它确实有所作为,是否值得?
我正在使用C语言编写程序,并且需要使其显着更快,因为这是对性能的评估.所以我很好奇汇编代码是否可以在任何级别使C程序更快?如果我用汇编代替部分C代码,是否可以缩短程序的运行时间?(例如巨大的循环).
谢谢.
assembly ×8
c++ ×5
performance ×4
x86 ×4
c ×3
optimization ×3
64-bit ×1
atoi ×1
biginteger ×1
decompiler ×1
exe ×1
increment ×1
intrinsics ×1
simd ×1
sse ×1
visual-c++ ×1
windows ×1