为什么在C#速度比C++慢的情况下你还想使用它?

37

我学完了C++和Java,现在正在寻找一门新语言学习。我本来想试试C#,但是很多人说它因为是高级语言而非常慢。那么为什么会有人使用C#呢?C++不是更快吗?它是不是可以使开发更容易,但最终产品速度较慢呢?

此外,C#还能用于哪些方面呢?你可以在Windows上与许多.NET内容以及ASP.NET一起使用它,但是还有哪些其他情况下会使用C#呢?使用它会有很多工作机会吗?


21
我不同意“公然冒犯”的关闭。质疑自己所听到的并不会引起冒犯。我认为这个问题没有错。我支持提问者,给他们+1(同时投票支持重新开放),因为他们询问的是一个非常合理的问题。 - Marc Gravell
8
我不认为这个问题已经充分地冒犯了我。 - spoulson
5
我投票作为“重复问题与答案(S&A)”关闭。该问题假设另一个问题的答案:“C# 是否缓慢”。这就像问你是否还在打你的妻子一样。 - Jon B
4
为什么这个问题被关闭?很多人都在搜索这个问题,stackoverflow社区提供了许多关于为什么要使用C#而不是C++的智慧回答。我个人花了很多时间寻找C++和.NET的基准测试,并从给出的答案中受益。 - Dave L
5
@CrazyJugglerDrummer - 不用担心 - 我觉得你并没有真正惹恼任何人。我们其实是一群非常友好的人,所以不要变得防御性强。有时候我们只是过于敏感 ;-p 欢迎来到StackOverflow,希望你可以从中获得知识和帮助。 - Marc Gravell
显示剩余7条评论
11个回答

77

这个“一群人”到底是谁?他们在与什么进行比较?

对于绝大多数情况来说,C++并不比C#更快。当然,在某些情况下它具有各种好处,特别是当您想要更确定的内存处理时,但在我的经验中,大多数应用程序的瓶颈并不在C++可以帮助的地方。正如spoulson所说,许多性能不在于确切实现而在于设计 - 在这里,能够轻松尝试不同的设计是有益的。

为什么使用C#当它比C++略慢一点?因为通常认为(即有些人不同意 :))它更容易开发而不会自己给自己挖坑。

至于C#可用于什么...你想用它做什么?除非你想开发驱动程序和内核,否则它可能很适合你。(即使是操作系统开发也有一些人使用C#...)

工作机会?大把。

缺点?嗯,.NET本身只能在Microsoft平台上使用。虽然有Mono,但它的可移植性不如Java(毫无疑问,对于同一群人来说,Java也是一种“慢”的语言)。


13
我也阅读过一些案例,其中由于.NET进行的运行时优化,C#在计算速度方面可以胜过C++。 - Will Eddins
6
您应该将安全性添加到此列表中,缓冲区溢出是最大的风险,这就是 Mac/Linux 和 Windows 系统被攻击的方式。不可变字符串是一件很好的事情。 - SQLMenace
9
我不确定是否应该允许Jon Skeet继续发布,他独占了所有的声望值(顺便说一句,他的回答很好)。 - Greg B
4
听起来你试图直接将C++代码移植到C#中。这是一个不好的想法——它们是不同的语言,有不同的习惯用法。同样,如果我试图直接将C#程序移植到C++中,我会发现许多东西都不一样或者不存在。这并不说明C++或C#有用与否——这只是说明在另一种语言中使用某种语言的习惯用法是一个不好的想法。 - Jon Skeet
4
@Hi-Angel: 但在惯用的C#中,我想不起上次想要获取结构体大小的时间了。对于序列化而言,有各种其他方法来完成任务。如果你只是在C++中倾倒原始字节,我个人也不会这样做,因为它在运行在不同架构上时相当脆弱。我要么使用诸如协议缓冲区之类的东西来处理数据对象,要么手动进行显式序列化。基本上,有很多解决方案可以进行序列化,这些解决方案不需要知道结构体的大小。 - Jon Skeet
显示剩余8条评论

43

用汇编语言编写的代码速度非常快。为什么不直接使用汇编语言编写呢?

不要听信一切。对于我所有的项目来说,C#已经足够快了。通常,性能更多是设计因素而不是原始平台性能的影响。


35
不行,那太慢了!把所有东西都建成硬件吧! ;) - JP Alioto
1
不用管他,穿孔卡片才是未来的趋势 :-) - SQLMenace
7
我会尽力为您翻译:在某种程度上,我所有的计算都是通过鲁伯·戈尔德堡机器完成的。 - spoulson
1
我使用F#编写所有代码,它会被编译成适合并行FPGA的硬件。这其实只是一个玩笑,我并不真的这么做。 - Mehrdad Afshari
当我看到最初的帖子时,你的回应几乎是我在脑海中想到的。在这里,一切都有取舍,速度并不总是100%重要。如果你有两辆车,其中一辆最高时速为220英里,另一辆最高时速为200英里...那里真的没有问题。当然,一辆车比另一辆车慢,但差别不大。同时,200英里每小时的汽车更容易驾驶,更易得到,并且比其他汽车便宜。这个权衡真的值得吗?好吧,这取决于你的需求。 - Matt Kenefick
真正的程序员用十六进制编程。 - rxantos

23

我的上一家公司由5位每人拥有15年以上经验的C++老手创立。他们花了一个多月时间构建一个特定的Windows服务。其中一位发现并尝试使用C#,在一周内他的进展比所有人在整个月里都要多。不久之后,他们全都转向使用C#。

如果C#可能执行较慢,为什么选择它:你会为那种快速开发的程度付出什么代价呢?


22

我必须说,你跟他们交流的人根本不知道自己在说什么。简单明了。

许多企业级应用程序都是基于C#和其他.Net语言构建的。它们本质上并没有任何缓慢的问题。是的,它们 tend 于拥有较慢的启动时间,但这基本上就是它们的全部。

我注意到你在语言列表中提到了Java。如果你对Java的速度感到满意,那么使用C#也不会出现任何问题。总的来说,C#在许多不同类型的基准测试中至少和Java一样表现得很好。


7
为什么C#可能会很慢? 事实上,C#被编译成“中间语言”,并在运行时进行JIT编译。但这样做可以为您带来性能优势,因为运行时可以生成最适合该平台的代码优化方式。
根据您想要编写的应用程序,语言的“速度”将产生轻微影响。应用程序的性能主要取决于您设计应用程序的方式,以及您使用的工具/技术是否得当等因素。当然,C#不是万能的,有些项目不适合使用它,因为它不是工作的正确工具,但对于大多数商业/企业应用程序来说,它都可以胜任。

它会为您提供开发时间和调试优势。但是它不会比C/C++给您带来任何性能优势。 - rxantos

6
我没有发现很多情况下C#不是一种好的语言选择,而.Net(或Mono)也不是一个好的平台。值得注意的例外是内核级开发或驱动程序。有许多需要低级别和原始性能的领域。对于大多数企业应用程序来说,C#是开发的更好选择之一。它得到了良好的支持,并且可以与许多其他系统、库、通信渠道和组件一起使用,更不用说是一种相当不错的语言(尤其是3.5版本)。

ASP.Net不是一个坏的平台,我通常发现对象/控件堆栈是复杂交互的缺点之一。我认为ASP.Net MVC更适合更可扩展的基于Web的应用程序。但同样,它比我过去使用的许多其他系统都要好。

在服务层甚至GUI开发方面,它非常好用。我在Web应用程序、服务/通信/业务层方面拥有更多的经验,而对于桌面GUI应用程序则不能做出太多评论。我感觉很多GUI开发更多地是关于IDE/工具包,而不是特定的语言。

至于速度慢,你特别列出了Java,在大多数情况下,C#/.Net与Java一样快或更快。在我看来,使用C#(Visual Studio)进行开发比Java(Eclipse)更加顺畅。对于基于Web的应用程序,我喜欢ASP.Net MVC(甚至是ASP.Net)胜过Swing。这只是我的个人观点。


只是想评论一下,除了C#、Node/JavaScript和Python这些系统外,我也会认真考虑使用Go或Rust。如今,如果有选择的话,我更倾向于首选Node/JS,其次是Rust。 - Tracker1

4
你所谈话的人不知道他们在说什么。总的来说,C#是一种非常类似于Java的语言;它有大部分相同的优点和缺点。它的工作方式非常相似(Java/C#编译成中间语言/字节码,然后被解释或JIT编译成本地代码,具有各种类似的优化,你作为程序员不需要担心)。它在许多与Java相同的情况下使用,并且真正针对同一市场。作为一种语言,它正在快速发展并带来了许多创新,但实际上它几乎只能在Windows上使用,如果这是你关心的问题的话。就就业市场而言,两者都是非常流行的语言。
至于学习一门语言,我建议选择一些不同的语言。你说你懂C++和Java;学习C#应该不难。尝试Scala或Python。两者都会给你一些新的视角(C#不太行),并通过教授你新的思考方式使你成为更好的程序员,而不仅仅是添加另一个工具到你的工具箱。

3

C#并不总是慢的 - 在许多情况下,它可以像你列出的任何语言一样表现良好。通常算法比语言选择更影响速度。

然而,C#非常表达力强,拥有一个极好的基类库可供使用,并且编译速度非常快。这意味着它很容易使用,相较于许多其他语言,尤其是C++,可以让你更加高效地工作。例如,我刚刚完成了一个小项目,在C++中,我本来预计要用1个人周的时间完成,而我们在C#中不到一天就完成了,主要是因为基类库简化了许多任务。


而使用 F#,您可以在一小时内完成它 :) - Dmitrii Lobanov

0

使用C#而不是C++的一个很大的原因是......看看所有那些C++存在的缓冲区溢出问题,人们通过在你的字符串或内存中注入可执行代码来接管你的机器,而垃圾收集器非常方便,我个人认为。


0

即使C++运行速度更快,在今天的计算机上差异也不大。这就是为什么在移动设备上,其中CPU和内存相对有限,C/C++仍然被广泛使用的原因。

但是考虑开发时间。如果使用C++需要2个月,而使用C#只需要1个月,你会选择哪一个呢?当需要进行大量修改/重构时,高级语言可以显著地提高效率和便捷性!


1
Java虽然不比C#更快,但经常用于手机上。 - Dinah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接