首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#的运行速度比C++快吗?

C#的运行速度比C++快吗?
EN

Stack Overflow用户
提问于 2009-09-14 13:55:42
回答 20查看 1.7K关注 0票数 3

我和一个朋友写了一个加密模块,我们想把它移植到多种语言上,这样它就不是特定于平台的加密了。最初是用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%。感谢所有的技巧,在我的研究中我学到了很多关于编译器的知识。

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2009-09-14 14:05:32

没有源代码,很难对你的加密算法/程序的性能做任何评价。尽管我认为你在将它移植到C++时犯了一个“错误”,这意味着你以一种低效的方式使用它(例如,发生了大量的对象复制)。也许你也使用VC6,而VC9会/可以产生更好的代码。

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

票数 24
EN

Stack Overflow用户

发布于 2009-09-14 14:01:55

这个问题非常宽泛。在C#中有效的东西在C++中可能无效,反之亦然。

您正在进行微优化,但您需要检查解决方案的整体设计,以确保它在C++中有意义。重新设计解决方案的大部分,以便在C++中更好地工作,这可能是一个好主意。

与所有与性能相关的事情一样,首先分析代码,然后修改,然后再次分析。重复上述步骤,直到达到可接受的性能水平。

票数 15
EN

Stack Overflow用户

发布于 2009-09-14 14:15:08

在C#中“相对”快的东西在C++中可能会非常慢。

你可以用C++写“更快”的代码,但你也可以写慢得多的代码。特别是在C++中,调试构建可能会非常慢。所以看看你的编译器的优化类型。

大多数情况下,在移植应用程序时,C#程序员倾向于使用“创建一百万个新对象”的方法,这确实会使C++程序变慢。您可以重写这些算法以使用预先分配的数组,并在这些数组上运行紧凑的循环。

使用预分配的内存,您可以通过将指向内存的指针转换为正确的pod结构化数据来利用C++的优势。

但这实际上取决于您在代码中编写的内容。

因此,测量你的代码,看看实现在哪里消耗了最多的cpu,然后构建你的代码以使用正确的算法。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1421697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档