将Freepascal函数转换为汇编
Convert Freepascal function to assembly?
由于性能问题,我想尝试将Freepascal函数(SHA1Update,从SHA1单元)转换为汇编。我使用Freepascal 2.6.4和Lazxarus 1.2.4。
原因是,我有一个循环结构(重复…直到),它从磁盘读取64Kb的原始数据块到缓冲区,然后对其进行散列。没有哈希,我可以以每分钟4Gb的速度读取磁盘。使用哈希后,它会减慢到1Gb p/min。因此有人建议将哈希例程转换为汇编程序。
在使用高级语言时,我是一个低于平均水平的程序员,更不用说汇编了,但是性能改进的潜力驱使我至少询问一下。
所以我的问题是:是否有一个程序或脚本,可以采取一个过程或函数,并神奇地将其转换为汇编,我可以使用Freepascal编译器编译?我知道它可以用C c++来完成,甚至使用像这样的基于web的系统
汇编确实是用来优化选定的代码序列的。但是,由于本机代码编译器生成机器码,通常使用中间的汇编源表示,然后通过汇编器运行,因此与简单地用编译器编译整个程序相比,您从使用编译器"神奇地转换"代码部分(经过优化)到与程序其余部分链接的汇编中获得的优势大约为零-毕竟您使用相同的编译器进行转换。从这个角度来看,编译器只不过是一个"神奇地将其转换为汇编"的程序。出于优化的目的,您需要手动编写这些部分的代码—并且您需要擅长于此。由于各种原因,现在许多编译器生成的代码比非专业编写的代码执行得更好。一个是目标CPU的最佳性能代码非常不同,确定特定CPU的代码效率的规则通常非常复杂。作为一名手工编码员,你需要知道它们之间的区别,知道如何编写性能良好的代码。许多编译器都有这种知识,因此能够生成代码,这样一个或另一个CPU体系结构或模型可以从编译器在代码生成中的差异中受益。
通常通过选择更有效的算法可以获得更好的性能增益。用高级代码编写的更好的算法,通常优于用汇编代码手工编写的不太合适的算法。因此,我会通过寻找替代和更快的算法来研究使哈希过程更快的可能性,而不是试图在这个阶段使用汇编来提高速度-考虑汇编优化作为最后,最后一步优化,当其他加速代码的方法已经用尽时。
正如@Bushmills已经解释的那样,在生成可移植可执行文件(*.exe)格式的机器码之前,您的代码将由FreePascal编译器自动转换为汇编。
您需要的不是汇编语言,而是用汇编语言编写的手工优化的代码。这是经验丰富的汇编程序员的任务。1)你可以自己成为汇编语言专家,这个堆栈溢出问题可以给你一些起点:一个好的NASM/FASM教程?我猜任何程序员都可以在一年左右的时间里成为汇编语言专家(CISC或RISC架构)。这取决于你以前的经验,你要修的课程和你的热情。对于理论背景(处理器无关),我推荐Donald Knuth的MMIX讲座
您应该能够2)看到FreePascal编译器生成的中间汇编文件,按照下面的说明:http://free-pascal-general.1045716.n5.nabble.com/Assembler-file-generate-by-compiler-td5710837.html讨论
如果你真的想在合理的时间范围内继续前进,那么我建议你创建最小的,完整的和可验证的示例,并在一些代码审查网站上请求代码审查
,在那里一些更有经验的程序员会查看你的代码并提出一些更改。这些站点应该是很好的候选站点:- https://codereview.stackexchange.com/
- https://www.codementor.io/
这些网站是专门为帮助初学者和中级程序员解决像你这样的问题而设计的
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- 汇编错误:调用基本型构造函数时无效的转换
- 如何安全地将FT_Handle转换为Lplong -64位汇编
- C 汇编器转换问题
- 汇编误差:从CSV转换为LIBSVM格式
- 内联汇编器直接双倍到长长转换
- 将C++转换为 MIPS 汇编
- 是否可以将C / C++源代码转换为汇编
- 将 GCC/ATT 风格的汇编器转换为可视化工作室汇编器
- 在C++中将汇编转换为机器代码
- 将C++内联汇编函数转换为delphi内联汇编函数
- 如何将这个汇编时间戳函数转换为c++
- 在汇编中使用malloc分配的内存-希望在c++中将其转换为三维数组
- 将Freepascal函数转换为汇编
- 将内联汇编代码转换为c++
- 将c++转换为MIPS汇编
- 在将这些c++代码行转换为汇编/mips时,我做错了什么?