两种语言“争霸赛”,php速度领先c#-ag真人官方网

两种语言“争霸赛”,php速度领先c#-ag真人官方网

来源:csdn博客 | 2022-03-22 17:21:42 |

译者 | 张洁

责编 | 屠敏

有人的地方就有江湖,有江湖的地方就有纷争。提起编程语言话题,总会有人想要不甘示弱地争论一番。这不,就在一位名为@withinboredom的开发者发布的一条“我最喜欢的语言已由c#更改为php”的帖子下面,就有人表示了不服。

@withinboredom在帖子中是这样描述的:“当你对php和c#这两种语言进行实际的基准测试时,会在一些实例中发现php的性能优于c#。”

而用户@no mcnoington却反驳道:“你有本事就展示代码示例,这样我就可以证明为什么你是错的。”

@withinboredom回怼到:“这个人(@no mcnoington)连个像样的笔名都懒得起,那就准备好被轰走吧!”

php和c#在读取文件方面的较量

@withinboredom首先展示的,是他认为“对每种语言都相当公平”的读取文件代码:php和c#将同步、逐字节地读取一个4mib大小的文件。让我们看看php和c#在读取文件方面的较量吧!

php :

function test(){ $file = fopen("/file/file.bin", "r"); $counter = 0; $timer = microtime(true); while ( ! feof($file)) { $buffer = fgets($file, 4096); $counter = substr_count($buffer, "1"); } $timer = microtime(true) - $timer; fclose($file); printf("counted %s 1s in %s milliseconds\n", number_format($counter), number_format($timer * 1000, 4));} test();

c#:

using system.diagnostics;using system.text;var test = () => { using var file = file.opentext("/file/file.bin"); var counter = 0; var sw = stopwatch.startnew(); while(!file.endofstream) { if(file.read() == "1") { counter ; } } sw.stop(); console.writeline($"counted {counter:n0} 1s in {sw.elapsed.totalmilliseconds:n4} milliseconds");}; test();

“读取文件几乎不包含用户级代码,只是单纯测试一种语言的基本功能。”@withinboredom还补充道,代码中添加计数只是为了防止php或c#中的编译器擅自优化或删除代码,并无其他作用。

然而,有些开发者对这个测试反驳道:“php并没有一个字节一个字节地读取文件啊(php中的fgets()函数用于从文件中读取一行)!”@withinboredom火速回怼:“可c#也不是逐个字节读取的!理论上读取方式是一样的。”

以下是两种语言在读取4mib文件下的对比结果:

php:32.49毫秒(平均超过10次运行)

c#:37.30毫秒(平均超过10次运行)

4mib大概只是一张完整照片的大小,所以为了进一步证明php的优越,@withinboredom还测试了这两种语言读取2.5g视频大小的文件速度:

php:24.82秒(平均超过10次运行)

c#:26.67秒(平均超过10次运行)

综上可以得出,不论是4mib还是2.5g文件,php在读取文件速度方面都优于c#。

函数调用开销是“罪魁祸首”?

很多开发者认为这是由于c#没有以二进制模式读取文件,其中函数调用开销是罪魁祸首。然而,@withinboredom表示,在函数调用方面, c#比php快很多个数量级,所以问题不在于此。以下是2.5gb文件中二进制模式的代码:

using system.diagnostics;using system.text; var bintest = () =>{ using var file = file.openread("/file/file.bin"); var counter = 0; var buffer = new byte[4096]; var numread = 0; var sw = stopwatch.startnew(); while ((numread = file.read(buffer, 0, buffer.length)) != 0) { counter = buffer.take(numread).count((x) => x == "1"); } sw.stop(); console.writeline($"counted {counter:n} 1s in {sw.elapsed.totalmilliseconds} milliseconds");}; bintest();

考虑到有人认为会是linq(语言集成查询)的问题,@withinboredom删除了.take和重复计数的相关代码:

有.take:38.40s(2.5gb文件)

没有.take:23.5s(2.5gb文件——错误的实现)

关于查看文件性能的测试

因为一些开发者想优化c#而不优化php,所以@withinboredom设计了下面只查看文件性能的测试,供开发者参考。

php:

function test(){ $file = fopen("/file/file.bin", "r"); $counter = 0; $timer = microtime(true); while (stream_get_line($file, 4096) !== false) { $counter; } $timer = microtime(true) - $timer; fclose($file); printf("counted %s 1s in %s milliseconds\n", number_format($counter), number_format($timer * 1000, 4));}test();

c#:

var bintest = () =>{ using var file = file.openread("/file/file.bin"); var counter = 0; var buffer = new byte[4096]; var sw = stopwatch.startnew(); while (file.read(buffer, 0, buffer.length) != 0) { counter = 1; } sw.stop(); console.writeline($"counted {counter:n} 1s in {sw.elapsed.totalmilliseconds} milliseconds");}; bintest();

经测试,结果如下:

php:423.50毫秒(平均超过10次运行)

c#:530.42毫秒(平均超过10次运行)

据@withinboredom介绍,php和c#之间的性能差异是他在去年发现的。当时他正巧在将一些杂七杂八的文件转移至dapr(分布式应用程序)和kubernetes,结果无意中发现:在读取文件方面,php居然比c#更快!

尽管@withinboredom表示目前他最爱的编程语言已变为php,但这并不代表c#开发者就要为此放弃一切,用php(或更好的c)重写所有文件的编写内容:“几毫秒的差距是不会毁掉开发者的。”

原文链接:yes, php is faster than c# – a walk within boredom

关键词:

ag真人官方网 ag真人官方网的版权所有.

联系网站:920 891 263@qq.com
网站地图