C# 比 C++ 运行得更快?

标签 c# c++ optimization

我和一个 friend 写了一个加密模块,我们想把它移植到多种语言,这样它就不是特定于平台的加密。最初是用 C# 编写的,我已经将它移植到 C++ 和 Java 中。 C# 和 Java 都将以大约 40 MB/s 的速度加密,但 C++ 将仅以大约 20 MB/s 的速度加密。为什么 C++ 运行得这么慢?是因为我使用的是 Visual C++ 吗?

我可以做些什么来加速我的代码?是否有不同的编译器可以更好地优化 C++?

我已经尝试过优化代码本身,例如使用 x >> 3 而不是 x/8 (整数除法),或者 y & 63 而不是 y % 64 和其他技术。我如何以不同的方式构建项目,以便它在 C++ 中具有更高的性能?

编辑:

我必须承认我没有研究编译器如何优化代码。我将在大学这里上一些专门学习编译器和解释器的类(class)。

至于我的C++代码,不是很复杂。没有包含,有“基本”数学以及我们称之为“状态跳跃”的东西来产生伪随机结果。我们所做的最复杂的事情是按位运算,这些运算实际上在初始散列阶段进行加密和未经检查的乘法。有动态分配的二维数组,它们在加密对象的整个生命周期中保持事件状态(并在析构函数中正确释放)。这里只有 180 行。好的,所以我的微优化不是必需的,但我应该相信它们不是问题,是时候了。为了真正深入,这里是程序中最复杂的代码行:

输入[L + 偏移量] ^= 状态[状态[SIndex ^ 255] & 63];

我不会移动数组,也不会处理对象。

从语法上讲,整个代码集运行完美,如果我用 C# 加密某些东西并用 C++ 或 Java 解密它,它将无缝地工作,所有 3 种语言都按照您预期的方式进行交互。

我不一定期望 C++ 比 C# 或 Java 运行得更快(它们彼此相差在 1 MB/s 以内),但我确信有一种方法可以使 C++ 运行得一样快,或者至少更快那么就是现在。我承认我不是 C++ 专家,我当然不像你们中的许多人那样经验丰富,但如果我可以将 99% 的代码从 C# 剪切并粘贴到 C++ 并让它在 5分钟,然后我有点失望,因为它需要两倍的时间来执行。

重新编辑: 我在 Visual Studio 中找到了一个我之前忘记设置的优化。现在 C++ 的运行速度比 C# 快 50%。感谢所有提示,我在研究中学到了很多关于编译器的知识。

最佳答案

如果没有源代码,就很难说出您的加密算法/程序的性能。 我认为你在将它移植到 C++ 时犯了一个“错误”,这意味着你以低效的方式使用它(例如,发生了大量的对象复制)。也许您还使用了 VC 6,而 VC 9 会/可能会生成更好的代码。

至于“x >> 3”优化……现代编译器确实会自行将整数除法转换为位移位。不用说,这种优化可能根本不是您程序的瓶颈。您应该首先对其进行概要分析,以找出您将大部分时间花在哪里:)

关于C# 比 C++ 运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421697/

相关文章:

c# - 如何确定给定文件是类文件?

c# - 将 GetWhere 查询 (Func<entityDTO,bool>) 传递给需要 (Func<entity,bool>) 参数才能工作的数据层方法

c++ - 如何使用xml lib在excel中设置列宽

c++ - 在 C++ 中为 volatile 数组赋值

image - ASP.NET MVC 如何优化数百个图像以减少 http 请求

C++ 调整/优化

c# - 我可以使用反射在 ASP.NET 中查找 bin/[Configuration] 文件夹而不是 asp 临时文件夹吗

c# - 尽管有更新冲突,但 EF 没有抛出 DbUpdateConcurrencyException

c++ - 使用 boost.process 同时读取和写入 child 的 stdio

matlab - 在matlab中快速计算图像的梯度