【发布时间】:2025-12-09 22:55:02
【问题描述】:
我和一个朋友编写了一个加密模块,我们希望将它移植到多种语言,这样它就不是特定于平台的加密。最初用 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++ 中的性能更高?
编辑:
我必须承认我没有研究过编译器如何优化代码。我将在大学里参加专门学习编译器和解释器的课程。
至于我的 C++ 代码,它不是很复杂。没有包含,有“基本”数学以及我们称之为“状态跳跃”的东西来产生伪随机结果。我们所做的最复杂的事情是在初始散列阶段实际执行加密和未经检查的乘法的按位运算。有动态分配的 2D 数组在 Encryption 对象的生命周期内保持活动状态(并在析构函数中正确释放)。这里只有 180 行。好的,所以我的微优化不是必需的,但我应该相信它们不是问题,是时候了。为了真正深入了解,这是程序中最复杂的代码行:
输入[L + offset] ^= state[state[SIndex ^ 255] & 63];
我不是在移动数组,也不是在处理对象。
从语法上讲,整个代码集运行完美,如果我用 C# 加密某些东西并用 C++ 或 Java 解密它,这三种语言都可以按照您的预期进行交互。
我并不一定希望 C++ 运行得比 C# 或 Java 更快(它们之间的速度在 1 MB/s 以内),但我确信有一种方法可以让 C++ 运行得同样快,或者至少更快然后就是现在。我承认我不是 C++ 专家,我当然不像你们中的许多人那样经验丰富,但如果我能将 99% 的代码从 C# 剪切并粘贴到 C++ 并让它在 5 内工作分钟,然后我有点担心它需要两倍的时间来执行。
重新编辑: 我在 Visual Studio 中发现了一个我之前忘记设置的优化。现在 C++ 的运行速度比 C# 快 50%。感谢所有提示,我在研究中学到了很多关于编译器的知识。
【问题讨论】:
-
我对此感到惊讶,因为 C++ 应该比这两者都快,但是如果没有看到代码就很难分辨。确保您使用尽可能少的框架。
-
您确定,您正在运行发布配置吗?
-
您已经进行的那些优化是微优化,不应该进行:1)它们使代码的可读性降低。 2) 编译器为你做这些,它可能比你更好。
-
我在您的个人资料中查看了网站上的一些源代码,坦率地说,您的 C++ 相当糟糕。如果您不想发布源代码(正如您的“大项目”部分所建议的那样),那很好,但请在 * 上查找一些关于 C++ 的好书清单。你有很多东西要学...
-
您需要发布代码以供任何人帮助您,即使只是“核心”。虽然在这种情况下 C# 当然可能更快,但我怀疑像加密这样的数学运算在 C++ 中应该更慢。就像其他人所说的那样,您可能没有以 C++ 的方式做 C++ 的事情。另外拿出你的微优化,让编译器为你做!同样(我不是以冒犯的方式),因为你试图手动优化,我不认为您正在充分发挥 C++ 的潜力。
标签: c# c++ optimization