Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#比C#x2B运行得更快+;?_C#_C++_Optimization - Fatal编程技术网

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

C#比C#x2B运行得更快+;?,c#,c++,optimization,C#,C++,Optimization,我和一位朋友编写了一个加密模块,我们希望将其移植到多种语言,这样它就不是特定于平台的加密了。最初是用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++和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数组在加密对象的整个生命周期内保持活动状态(并在析构函数中正确释放)。这里面只有180行。好吧,我的微优化是没有必要的,但我应该相信它们不是问题所在,是时候了。要真正深入了解这一点,下面是程序中最复杂的一行代码:

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

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

从语法上讲,整个代码集运行得很好,如果我用C++加密,用C++或java解密,所有3种语言都会像你所期望的那样进行交互。 <> P>我不一定希望C++运行得比C++或java(在1 Mb/s之间)更快,但我确信有一种方法可以使C++运行得更快,或者至少现在速度更快。我承认我不是C++专家,我当然不像你们中的许多人那么熟练,但是如果我能把C 99%的代码剪切并粘贴到C++中,并在5分钟内使它工作,那么我有点被执行,需要花费两倍的时间。 重新编辑:
我在VisualStudio中发现了一个我以前忘记设置的优化。现在C++运行速度比C快50%。感谢所有的提示,在我的研究中,我学到了很多关于编译器的知识。

这个问题非常广泛。C中有效的一些东西在C++中可能不有效,反之亦然。

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


与所有与性能相关的事情一样,首先评测代码,然后修改,然后再次评测。重复此操作,直到达到可接受的性能水平。

如果没有源代码,很难对加密算法/程序的性能做出任何评价。 我认为你在把它移植到C++时犯了一个“错误”,意思是你用它效率很低(例如很多对象复制)。也许你也使用了VC 6,而VC 9可以产生更好的代码


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

< P> > C中的“相对较快”的东西在C++中可能非常慢。 <>你可以在C++中写“更快”的代码,但是你也可以写得慢一些。特别是调试构建在C++中可能非常慢。因此,请查看编译器的优化类型

<>主要是在移植应用程序时,C程序员倾向于使用“创建一百万个新对象”的方法,这真的使C++程序变得缓慢。您将重写这些算法以使用预先分配的数组,并在这些数组上以紧密循环运行

使用预先分配的内存,利用C++将其指向内存中的指针,将其转换为正确的POD结构化数据。 但这实际上取决于您在代码中编写的内容


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

试试英特尔编译器。它比VC或gcc好得多。至于最初的问题,我持怀疑态度。尽量避免使用任何容器,尽量减少冒犯函数中的内存分配。

< P>你的时序结果肯定不是我所期望的,写得好的C++和写得好的C。几乎可以肯定的是编写低效的C++。(要么如此,要么您不是使用相同类型的选项进行编译。请确保您正在测试发布版本,并检查优化选项

但是,正如您所提到的,微优化对提高性能没有任何作用,您在浪费时间做编译器将为您做的事情

通常你从算法开始,但在这种情况下,我们知道算法不会导致性能问题。我建议使用探查器看看你是否能找到一个大时间接收器,但它可能与C#或Java中没有什么不同

<>我建议看C++与java和C++的区别。一个大的东西是对象。在爪哇和C中,对象以与对象的C++指针相同的方式表示,尽管从语法上看不明显。

如果你在爪哇和C++中移动对象,你正在移动指针

Class Message
{
    char buffer[10000];
}

Message Encrypt(Message message)  // Here you are making a copy of message
{
    for(int loop =0;loop < 10000;++loop)
    {
        plop(message.buffer[loop]);
    }

    return message;  // Here you are making another copy of message
}
Message& Encrypt(Message& message)  // pass a reference to the message
{
   ...

    return message;  // return the same reference.
}
void myFunc()
{
    Message    m;
    // read message into m

    Encrypt(m);
}

void alternative()
{
    boost::shared_pointer<Message>  m(new Message);

    EncryptUsingPointer(m);
}
void DoSomething(const HeavyStructure param);  // Heavy structure will be copied
void DoSomething(const HeavyStructure& param); // No copy here
C native:       50
C managed:      15
C#:             10