Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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和C、X2B时应考虑哪些因素?x2B;用于图像处理项目? 我想开发一些图像处理代码,我想知道在C++和C</p>中开发它们有很大的不同吗? 有没有详细的文档说明在C++中实现什么是好的,在C++中有什么好的?_C#_C++_Performance - Fatal编程技术网

C# 选择C和C、X2B时应考虑哪些因素?x2B;用于图像处理项目? 我想开发一些图像处理代码,我想知道在C++和C</p>中开发它们有很大的不同吗? 有没有详细的文档说明在C++中实现什么是好的,在C++中有什么好的?

C# 选择C和C、X2B时应考虑哪些因素?x2B;用于图像处理项目? 我想开发一些图像处理代码,我想知道在C++和C</p>中开发它们有很大的不同吗? 有没有详细的文档说明在C++中实现什么是好的,在C++中有什么好的?,c#,c++,performance,C#,C++,Performance,据我所知,由于C#代码是在运行之前编译成机器代码的(使用.NET CLR JIT编译器),如果在代码开发过程中,您看到特定语言建议如何实现设计模式,那么这两种语言之间应该不会有太大的差异(例如,使用大量新的和使用固定数组) 编辑: 还有一些我起初没有想到的其他参数,但当我阅读一些答案时,我现在正在看这些参数: 1-这是一个高级项目,这意味着我可以要求用户拥有一台非常好的计算机(大量内存和多核处理器) 2-我可以假设用户有一个非常好的图形卡,所以我可以使用它的GPU进行处理。 3-我认为WPF有利

据我所知,由于C#代码是在运行之前编译成机器代码的(使用.NET CLR JIT编译器),如果在代码开发过程中,您看到特定语言建议如何实现设计模式,那么这两种语言之间应该不会有太大的差异(例如,使用大量新的和使用固定数组)

编辑: 还有一些我起初没有想到的其他参数,但当我阅读一些答案时,我现在正在看这些参数: 1-这是一个高级项目,这意味着我可以要求用户拥有一台非常好的计算机(大量内存和多核处理器) 2-我可以假设用户有一个非常好的图形卡,所以我可以使用它的GPU进行处理。
3-我认为WPF有利于这一发展(我说得对吗!)。是否有类似的C++库?我和MFC一起工作,但是我不确定MFC在处理需要显示图像的项目时是很好的,而GUI非常重要。

< P>这取决于你在这两种语言上有多好,如果你真的是图像处理编程或算法的专家,C++会给你的杂技在优化中提供更多的自由。但是如果你不是那个专家,用高级语言

来保护你自己,有几个因素需要考虑…… 是否有您可能想要使用的库?如果有,并且它们是.Net,那么这可能会影响您选择C#的决定

然而,我认为可以肯定地说,大多数密集型数值应用程序(图像处理基本上是2D矩阵上的数值密集型操作)将使用本机代码编写。有一个非常好的例外——看看Paint.Net,它几乎完全是用托管代码编写的,并且具有出色的性能和功能(http://getpaint.net)


你申请的目的是什么?如果这是一种“爱好”或学习锻炼,那么就用你最喜欢的语言。如果是商业应用,我首先看看库选项。

< P>作为把图像处理库从C++转换成C的人,做了基准测试,语言对你所做的速度影响不大,更重要的是你使用的算法和你使用的API来操纵图像。(即在Windows中使用位图上的锁位),我可以通过在C++中比C++更容易地编写更多并行代码,以及C++不能够被卡住的能力来获得显著的速度增长。但是有各种各样的选项来方便并行化操作(在图形上是相当内在的),这使得在从C++转换到C语言时,速度的增加(加上只需要担心释放资源,而不是内存也使得生活变得更容易)。显然,如果你在C++中非常舒服,那么你可以在C++中编写更快的代码,但是你知道C++和SIMD能很好地击败C++编译器。我还应该注意到,我们假设C++的C语言被转换成C>C,假设我们将“<强>丢失/强>大约10%的速度,我们转换的原因是在添加新的特征时花费太高了。对C的重写变得值得我们去做,最终的结果是更快的只是一个奖励(现在我也应该提到,原来的库是在SIMD扩展之前写成的,在这里添加到VisualC++中,所以使用它对原始库作者来说是不可用的).

虽然您正确地认为.NET代码会被JIT编译为机器代码,但您必须意识到您对该过程几乎没有控制权。您不需要选择目标指令集,而托管代码倡导者声称JIT编译更优越,因为它可以在每台机器上使用可用的最快指令集事实上,这项计划尚未实施

底线:可以使用SSE指令编写C++代码,它运行速度比在同一CPU上JIT生成代码快4倍。


还有一些值得一提的事情:SIMD并行比多线程更容易编写,编译器也更容易优化。SIMD没有开销,但线程同步不是免费的。SIMD有更少的隐藏陷阱,因此更容易获得线性加速。多线程同步非常容易陷入缓存线共享和争用。托管语言完全无法控制错误共享

<>是的,C ^使得更容易做多线程。很糟糕。C++使多线程的操作变得更加可行,而且你可以在调整单线程代码时获得足够的速度,甚至不需要处理线程的额外复杂度。 如果您决心优化自己,以下是一些技巧:(一旦达到了所需的性能,就在这条线路上的任何一点停止,因为应用越多,代码就越复杂)

  • 处理原始数据时,不要使用在一堆像素上添加间接和抽象的API。这不仅会降低速度,还会影响下一批改进。(vs
    SetPixel
    ,原始图像访问的本机例程是
    GetDIBits

  • 缓存优化。一种简单的方法是将最里面的循环展开16倍左右。然后反转循环嵌套顺序。这将导致处理矩形数据块,这些数据块通常是相互依赖的,因此您可以多次访问每个数据块进行缓存