草庐IT

c# - 在为图像处理项目选择 C# 和 C++ 时,我应该考虑哪些因素?

coder 2024-02-09 原文

我想开发一些图像处理代码,我想知道用 C++ 和 C# 开发它们是否有很大区别?

有没有详细的文档解释什么用C#实现好,什么用C++实现好?

据我所知,由于 C# 代码在运行前被编译为机器码(使用 .NET CLR JIT 编译器),如果在代码开发期间,您可以查看特定语言建议实现设计模式(例如,使用大量新数组与使用固定数组)。

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

最佳答案

.NET IL 被编译为机器代码,就像 C++ 一样。但几乎总是 C++ 代码会更快,因为:

  • 编译时间成为运行时的一部分(只有一次,但有时这是一个问题)
  • 由于上述原因,JIT 编译器在优化上花费的时间少于 AOT 编译器。因此,JIT 生成的代码通常较慢。例如,JIT 通常不会矢量化任何东西,这对图像处理很重要。大多数情况下,由于 VM 限制,甚至无法生成矢量化代码(Mono.Simd 是一个异常(exception))
  • VM 中的语言必须确保程序不会逃逸 VM。例如,他们必须在每次访问时检查数组边界(除非编译器可以证明索引始终在范围内;请记住,JIT 编译器不会在此类分析上花费太多时间)。
  • 对于时间关键的内核,您可以自己插入汇编程序指令。 VM 不允许这样做,因为汇编程序可能会脱离 VM。

在某些情况下,托管代码可能比非托管代码更快:

  • 垃圾收集器允许比 malloc 更有效地分配内存。但是,除非内存只是短时间使用,否则 Mark-And-Sweep 也需要一些时间。
  • JIT 可能会在代码上使用更多静态假设(例如,它知道虚函数的所有可能实现)来编译代码,并在假设不再成立时重新编译。这是在 Java HotSpot 中完成的,但不是在 Microsoft 的 JIT 或 Mono 中。

总结:如果执行速度很重要,请使用 C++。但是 C# 可以很快足够,正如 Paint.NET 所展示的那样。还要考虑主要使用 C# 编写代码的选项,一旦您对某些重要功能的速度不满意,请在 C++/CIL 中重新实现它。或使用 P/Invoke 调用优化函数.

关于c# - 在为图像处理项目选择 C# 和 C++ 时,我应该考虑哪些因素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419992/

有关c# - 在为图像处理项目选择 C# 和 C++ 时,我应该考虑哪些因素?的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  9. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  10. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

随机推荐