当前位置: 首页 > 科技观察

什么时候用Rust什么时候用Golang?

时间:2023-03-14 00:06:26 科技观察

Golang和Rust之间有明显的区别。Golang更侧重于构建可以无限扩展的WebAPI和小型服务,尤其是在goroutines的强大支持下。Rust也可以用于小型服务,但从开发人员的经验来看,事情要困难得多。Rust非常适合处理大量数据和其他CPU密集型操作,例如执行算法。这是Rust相对于Golang的最大优势。需要高性能的项目通常更适合Rust。在本教程中,我们将比较和对比Golang和Rust,评估这两种编程语言的性能、并发性、内存管理和整体开发人员体验。我们还将概述这些元素,以帮助您一目了然地为您的项目选择正确的语言。如果您是Rust新手,最好在继续之前阅读初学者指南[1]。如果一切就绪,让我们开始吧!PerformanceGolang最初由Google的工程师设计,并于2009年向公众推出。它的创建是为了提供一种易于学习和编码的C++替代方案,并针对在多核CPU上运行进行了优化。从那时起,Golang对于希望利用该语言提供的并发性优势的开发人员来说非常有用。该语言提供了goroutines,它允许您将函数作为goroutines运行。Golang的一大优势是您可以轻松使用goroutines。只需在一个函数前面添加一个函数,使其作为一个goroutine运行。Golang的并发模型允许您跨多个CPU内核部署工作负载,使其成为一种非常高效的语言。packagemainimport("fmt""time")funcf(fromstring){fori:=0;i<3;i++{fmt.Println(from,":",i)}}funcmain(){f("direct")gof("goroutine")time.Sleep(time.Second)fmt.Println("done")}尽管有多核CPU支持,但Rust的性能优于Golang。Rust在执行算法和资源密集型操作方面效率更高。这个基准游戏[2]比较了二叉树等不同算法的Rust和golang。对于所有经过测试的算法,Rust至少要快30%;在二叉树计算的情况下,高达1,000%。Bitbucket[3]的一项研究表明,Rust的性能与C++相似。(来源:BenchmarkingtheGame[4])并发正如上面所说,Golang支持并发。例如,假设您正在运行一个处理API请求的Web服务器。您可以使用Golang的goroutine程序将每个请求作为一个goroutine运行,通过将任务分配给所有可用的CPU内核来最大化效率。Goroutines是Golang内置功能的一部分,而Rust只支持原生的async/await语法来支持并发。因此,Golang开发人员在并发方面具有经验优势。然而,Rust在保证内存安全方面要好得多。下面是Rust中简化线程的示例:usestd::thread;usestd::time::Duration;fnmain(){//1.createanewthreadthread::spawn(||{foriin1..10{println!("thread:number{}!",i);thread::sleep(Duration::from_millis(100));}});println!("hifromthemainthread!");}并发一直是困扰开发者的一个棘手问题。在不影响开发人员体验的情况下保证内存安全并发并不是一件容易的事。然而,这种极端的安全关注导致了可证明正确的并发性的创建[5]。Rust试图使用所有权的概念来防止未经请求的资源访问,以防止内存安全漏洞。Rust提供四种不同的并发范例来帮助您避免常见的内存安全陷阱。我们将仔细研究两种常见的范例:通道和锁。Channelchannel[6]有助于将消息从一个线程传输到另一个线程。虽然这个概念也存在于Golang中,但Rust允许您将指针[7]从一个线程传输到另一个线程以避免资源争用。通过传递指针,Rust可以在通道上强制执行线程隔离。同样,Rust在并发模型方面表现出对内存安全的痴迷。锁只有在持有锁[8]时才能访问数据。Rust依赖于锁定数据而不是cod的原则,这在Java等编程语言中很常见。有关所有权和所有并发范例的更多详细信息,请查看“FearlessConcurrencywithRust[9]”。内存安全的早期所有权概念是Rust的主要卖点之一。Rust将类型安全[10]提升到一个新的水平,这对于实现内存安全并发也很重要。根据Bitbucket博客[11],“Rust非常严格和繁琐的编译器会检查您使用的每个变量和您引用的每个内存地址。它避免了可能发生的数据竞争,并通知您未定义的行为。”这意味着您不会因为Rust对内存安全的痴迷而导致缓冲区溢出或竞争条件。然而,这也有其缺点。比如在写代码的时候一定要对内存分配原则有很好的理解。始终保持内存安全并不容易。开发者体验首先,让我们看看每种语言的学习曲线。Golang在设计时考虑到了简单性。开发人员经常将其称为“无聊”的语言,即其有限的内置功能集使Golang易于学习和使用。此外,Golang提供了比C++更简单的替代方案,隐藏了内存安全和内存分配等方面。Rust采用不同的方法,迫使您考虑内存安全等概念。所有权的概念和传递指针的能力降低了学习Rust的吸引力。当您不断考虑内存安全时,您的工作效率就会降低,并且您的代码必然会变得更加复杂。与Golang相比,Rust的学习曲线非常陡峭。值得一提的是,与Python和JavaScript等动态语言相比,Golang的学习曲线更为陡峭。何时使用GolangGo适用于各种用例,使其成为Node.js用于创建WebAPI的绝佳替代品。正如LorisCro[12]指出的那样,“Go的并发模型非常适合必须处理多个独立请求的服务器端应用程序”。这就是Golang提供goroutines的原因。此外,Golang内置了对HTTPWeb协议的支持。您可以使用内置的HTTP支持快速设计一个小型API并将其作为微服务运行。因此,Golang非常适合微服务架构,满足API开发者的需求。简而言之,如果您重视开发速度并且更喜欢语法简单而不是性能,那么Golang是一个不错的选择。最重要的是,Golang提供了更好的代码可读性,这是大型开发团队的重要标准。在以下情况下选择Golang:您关心简单性和可读性您需要简单的语法来快速编写代码您想要使用更灵活的支持Web开发的语言何时使用Rust当性能很重要时,例如在处理时Rust是一个不错的选择你有很多数据。此外,Rust让您可以细粒度地控制线程的行为方式以及线程之间的资源共享方式。另一方面,Rust具有陡峭的学习曲线,并且由于内存安全的额外复杂性而减慢了开发速度。这不一定是缺点。当编译器检查每个数据指针时,Rust还保证您不会遇到内存安全错误。对于复杂的系统,这种保证就派上用场了。在以下情况下选择Rust:您关心性能您想要对线程进行细粒度控制您重视内存安全而不是简单性Go与Rust:我的大真相让我们从突出相似之处开始。Go和Rust都是开源的,旨在支持微服务架构和并行计算环境。两者都通过并发优化了可用CPU内核的利用率。但归根结底,哪种语言最好?有很多方法可以解决这个问题。我建议考虑您要构建哪种类型的应用程序。Golang非常适合创建Web应用程序和API,这些应用程序和API在支持微服务架构的同时利用其内置的并发功能。您也可以使用Rust来开发WebAPI,但它并不是为这个用例而设计的。Rust对内存安全的关注增加了复杂性和开发时间,尤其是对于相当简单的WebAPI。但是,对代码的大量控制允许您编写更优化、内存效率更高且性能更高的代码。简而言之,Golang与Rust的争论实际上是简单性与安全性的问题。如需更多观点,请查看“在Go和Rust之间进行选择[13]”。LogRocket:全面了解实时Rust应用程序调试Rust应用程序可能很困难,尤其是当用户遇到难以重现的问题时。如果您对监视和跟踪Rust应用程序的性能、自动显示错误以及跟踪缓慢的网络请求和加载时间感兴趣,请尝试LogRocket[14]。LogRocket[15]就像Web应用程序的DVR,实际上记录了Rust应用程序中发生的一切。无需猜测问题发生的原因,您可以总结并报告问题发生时应用程序的状态。LogRocket还监控应用程序的性能,报告客户端CPU负载、客户端内存使用情况等指标。