如果您看到一篇文章X语言比Y语言更快,则可以关闭该文章。





我一直以人道主义的头脑思考这种方式-如果程序员知道如何提高性能,那么有必要提高性能。高效的解决方案=正确的解决方案。一种编程语言可能比另一种慢,如果事实证明,该编程语言就浪费了。



好吧,可以肯定的是-如果开发人员是性能专家,那么即使这些事情是错误的,他也会淹没所有这些事情。



自然,所有这些都是胡说八道,但这不是我要告诉你的。因此,开发人员和数学家,物理和数学科学候选人,BenchmarkDotNet和perfolizer的维护者,Pro .NET Benchmarking一书的作者以及非常非常出色的工程师Andrei Akinshin来到了我们的播客。





以下是部分报价。



不可能预见基准测试中的所有内容



我的一位同事最近有以下事情。他在早上编程,一切都很好,一切都很快进行。在某些时候,一切开始变慢-Rider变慢,IDEA,浏览器-一切变慢。他根本不明白是怎么回事?然后我意识到。他在靠窗的黑色笔记本电脑上工作。早上天气很凉,白天太阳升起,笔记本电脑变得很热,进入了节流状态。



他知道有这样的事情,知道物理环境会影响性能,因此他很快意识到发生了什么。他脑子里有一个模型,根据这个模型世界可以运转,在这个模型下,他或多或少地很快发现了正在发生的事情。



也就是说,在基准测试中可以获得的最重要的技能是不了解绝对所有细节,包括所有运行时和所有硬件。最主要的是了解如何采取行动来发现问题,最好是以最小的努力尽快完成。



我将用语言进行类比。当您学习第一门函数式编程语言时,您需要稍微改变对世界的态度-了解函数式编程的原理以及通常的思考方式。然后,使用下一个功能语言X,您已经掌握了这些原理。您会看到几个问候世界,也开始写作。



同时,您可能不了解该语言的某些细微差别。您可能不知道某些语法构造如何工作,但这并不会给您带来太大的麻烦。您感觉舒适并且写字。面对难以理解的行为-阅读手册,弄清楚了,新的事实很容易进入您的世界图画,并且您走得更远。而且您永远不会学习世界上所有功能语言的所有细微差别,但一般的方法仍将掌握在您的脑海中。



我相信您需要在每个领域达到相似的水平,然后再广度发展。



在基准测试的某个时刻,我专门专注于测量精度,某些运行时的功能,铁定的功能以及其他一些功能。然后,我不再每次都为自己发现America,所有性能问题都开始落入我已经知道的类别。而且我在性能分析的方向上广度:如何处理我们测得的数字。这是我尚未达到知识边缘的领域。对我来说,有些事情已经变得很清楚了,但是仍然有大量工作要做-了解如何在实践中应用所有这些内容,使用哪些公式,不使用哪些方法,哪种方法是好的以及哪种方法不是。



为进行基准测试而进行基准测试并非最佳做法



始终应该有一些业务绩效要求,您应该始终了解自己的目标。如果您没有业务需求,那么执行性能也没有意义。因此,当存在业务需求时,您已经开始了解至少可以通过肉眼可以使用的方法,以及哪些不能。如果没有,则进行基准测试,检查-哪种方法适合您的要求。



而且,当您拥有一套算法,用于编写代码,设计等内容的选项,并且所有内容都符合要求时,您已经选择了与项目其余部分更一致的内容,这反映了您对美学的看法,如何正确编写代码...



粗略地说,如果一个集合中最多包含10个元素,并且有两种选择-为多维数据集编写一个简单的算法,或者为n * log n写一个非常复杂的算法-我将为每个人编写一个简单的多维数据集,每个人都可以理解,这很容易维护和修改。因为我知道他永远不会突破我的表现限制。



如果您为小型数据集编写了一个缓慢的解决方案,然后将其用于大型数据集,并且没有超级坏的后果(通常没有后果)-那么,让我们对其进行修复。但是在头脑中,将会有一个模型,该模型将在将来避免这些错误。



例如,您可以在方法的最开始处放置一个断言,以使集合中的元素数量不超过该数量。然后,下一个意外尝试使用您的方法的程序员将立即看到异常,并且不会使用该异常。这样的事情是有经验的。



还有另一个问题-不稳定的业务需求。他们肯定会改变-这是我们现实的公理,没有办法摆脱它。凭借经验,您将能够肉眼预测需求可能会发生变化的地方,值得建立良好性能水平的地方以及负载可能会增加的地方。



虽然没有这种直觉,但是您可以反复试验并查看会发生什么。



您始终会在性能和美感之间进行权衡



如果您尽可能高效地编写代码,那么您的代码将非常糟糕,令人作呕-即使您对美观不屑一顾,也将难以维护,并且会不断出现细微的错误,因为体系结构不好,代码不好,一切都不好。



我认为您需要关注当前的业务需求,并在其中编写最干净,最易懂,美观,可维护的代码。而当它开始收割时(或者有一种感觉它即将开始),那么某些事情已经在改变。



即使您始终只专注于性能,也没有完美优化,最高效率的代码之类的东西。这意味着一切-忘了C#,忘了所有美丽的语言。而且最好用机器代码编写,因为汇编器的语法也受到限制。而且,如果您立即写字节,那么性能将会得到提高。



在某些情况下,最快的代码竟然是最美丽,最明显,最正确的代码。但是,这种折衷不可避免地会出现在数十个数百个小时刻中。假设有一种检查数组界限冲突的事情。您可以同意运行时会照顾您在所有位置检查数组的范围,并且如果转到减号第一个元素,则会得到异常,并且不会从内存的左大块读取数据。



有了这种信心,您绝对不会从错误的内存中减去-您只需付出少量的性能即可。也就是说,我们使用性能作为资源,以使程序更加稳定,易于理解和可维护。



语言不具有表演性



如果您看到一篇文章X语言比Y语言更快,则可以关闭该文章。语言是数学的抽象。这是程序编译所依据的一组规则。它没有性能,没有性能,它存在于您的脑海中,并体现在文本编辑器中。



性能可用于特定的运行时,环境,特定的程序和特定的文件。考虑所有这些因素后,就可以讨论性能了。但是,这是一个组合爆炸,您不能说这种语言中的一个代码总是比另一种语言中的另一个代码快,因为新版本的硬件和运行时即将问世。您将永远不会经历生活中所有外部因素的可能组合。您使用的apishkas根本不同。



例如,在开发的早期阶段,他们使用条件语言实现了一种使用气泡排序的方法。好吧,我不知道-这些家伙想尽快推出该版本,写出他们可以做的最简单的排序。您采用了这种方法,并使用了这种方法,结果证明,在大数据上它比在另一种完成Quicksort的语言中要慢。这是否意味着您可以谈论某些语言的性能?没有。您可以说,在这些环境中,在该操作系统,该硬件上的这种语言所产生的特殊影响要比在另一种环境中的另一种语言所造成的影响慢。所以你可以说。但这将是一段很长的文本,需要正确地表述。



按照惯例,我们可以说在大多数情况下C ++比JavaScript更快。但是,如果说具有良好C ++经验的C ++程序员用C ++编写,那么编写的程序可能比JavaScript javascript更快,或者编写可以在浏览器中工作的程序,那将是更正确的说法。



但是这里也有很多保留。但是,如果用JavaScript编写的那个家伙说不是,而是去那里进行某种WebAssembly或重做其他事情怎么办?或在GitHub上找到一个JavaScript超级解释器-编译器,它通过三个半语法构造与JS的截短子集一起工作,但生成超快速本机代码。



在那儿,如果您愿意,您可以编写将取代C ++的代码。此外,您可以编写自己的JavaScript编译器,该编译器旨在编译单个程序并超过速度上的“加分”。从原则上讲,这是一个有效的选择。



受欢迎的开源项目的社会压力



随着项目的增长和普及,一定程度的责任感。但是您实际上没有义务。这个事实并不总是很容易理解,尤其是当各种各样的人来到GitHub并说:“这对我来说不起作用!紧急修复!我真的需要这个工作。去修复它!”或花花公子找到工作,然后我正在休假。三四天过去了,我什至没有看到他从那里开始做某事。我在某处休息,伙计开始-“你为什么不回答我?这个项目有什么样的社区?你们通常都是令人作呕的人,您必须对自己做坏事!我浪费了时间,写信给你,你错了,而你根本没有做任何事情,你已经无视我四天了!那怎么可能?!”



而且,该项目越受欢迎,来自那些认为开源是其他人免费为您工作的人的社会压力就越大。但实际上并非如此。



现在,当对想要从您那里得到东西的人表现出免疫力时,生活就会变得更加轻松。现在,当我有时间和精力编写代码时,就可以进入BenchmarkDorNet。我知道那里有很多错误。它们大部分都是不严格的,并且只涉及一些边际情况-在这样的环境中,使用第五个DotNet的最新预览,某些地方不起作用。好吧,好的,让它不起作用。当我有心情时,我会去修复它。



如果其他人需要它,他们可以自行修复并发送请求请求-如果有时间和心情,我会进行审核。






此处观看整个播客



All Articles