我和一个朋友写了一个加密模块,我们想把它移植到多种语言上,这样它就不是特定于平台的加密了。最初是用C#编写的,我已经把它移植到了C++和Java中。C#和Java都会以40MB/s的速度进行加密,但C++只能以20MB/s的速度进行加密。为什么C++的运行速度要慢得多?是因为我使用的是Visual C++吗?
我能做些什么来加速我的代码?有没有不同的编译器可以更好地优化C++?
我已经尝试过优化代码本身,比如使用x >> 3
而不是x / 8
(整数除法),或者使用y & 63
而不是y % 64
和其他技术。如何以不同的方式构建项目,使其在C++中更具性能?
编辑:
我必须承认我没有研究过编译器是如何优化代码的。我在大学里将要学习的课程是专门学习编译器和解释器的。
至于我用C++编写的代码,它并不是很复杂。没有包含,有“基本”的数学和一些我们称之为“状态跳跃”的东西来产生伪随机结果。我们所做的最复杂的事情是位操作,它实际上在初始哈希阶段进行加密和未检查的乘法。有一些动态分配的2D数组,它们在加密对象的整个生命周期内都保持存活(并在析构函数中适当地释放)。这里只有180行。好吧,所以我的微优化是不必要的,但我应该相信它们不是问题所在,这是时候了。为了真正深入了解这一点,下面是程序中最复杂的代码行:
inputL + offset ^=状态[stateSIndex^ 255 & 63];
我不会移动数组,也不会处理对象。
从语法上讲,整个代码集运行得很完美,如果我用C#加密和用C++或Java解密,这三种语言都会像你预期的那样交互。
我不一定期望C++运行得比C#或Java更快(它们的速度相差不到1MB/s),但我确信有一种方法可以让C++运行得和现在一样快,或者至少比现在更快。我承认我不是C++专家,我当然不像你们中的许多人那样经验丰富,但如果我可以将99%的代码从C#剪切并粘贴到C++中,并在5分钟内完成,那么我有点担心它需要两倍的时间来执行。
重新编辑:我在Visual Studio中发现了一个之前忘记设置的优化。现在C++的运行速度比C#快50%。感谢所有的技巧,在我的研究中我学到了很多关于编译器的知识。
发布于 2009-09-14 14:05:32
没有源代码,很难对你的加密算法/程序的性能做任何评价。尽管我认为你在将它移植到C++时犯了一个“错误”,这意味着你以一种低效的方式使用它(例如,发生了大量的对象复制)。也许你也使用VC6,而VC9会/可以产生更好的代码。
至于"x >> 3“的优化...现代编译器会自己将整数除法转换为位移位。不用说,这种优化可能根本不是程序的瓶颈。您应该首先对其进行分析,以找出您在哪里花费了大部分时间:)
发布于 2009-09-14 14:01:55
这个问题非常宽泛。在C#中有效的东西在C++中可能无效,反之亦然。
您正在进行微优化,但您需要检查解决方案的整体设计,以确保它在C++中有意义。重新设计解决方案的大部分,以便在C++中更好地工作,这可能是一个好主意。
与所有与性能相关的事情一样,首先分析代码,然后修改,然后再次分析。重复上述步骤,直到达到可接受的性能水平。
发布于 2009-09-14 14:15:08
在C#中“相对”快的东西在C++中可能会非常慢。
你可以用C++写“更快”的代码,但你也可以写慢得多的代码。特别是在C++中,调试构建可能会非常慢。所以看看你的编译器的优化类型。
大多数情况下,在移植应用程序时,C#程序员倾向于使用“创建一百万个新对象”的方法,这确实会使C++程序变慢。您可以重写这些算法以使用预先分配的数组,并在这些数组上运行紧凑的循环。
使用预分配的内存,您可以通过将指向内存的指针转换为正确的pod结构化数据来利用C++的优势。
但这实际上取决于您在代码中编写的内容。
因此,测量你的代码,看看实现在哪里消耗了最多的cpu,然后构建你的代码以使用正确的算法。
https://stackoverflow.com/questions/1421697
复制相似问题