当前位置:首页 > 芯闻号 > 充电吧
[导读]其实我早就想写这样的文章了,但是,这个明显会挑起语言之争么。作为一个多年的版主,笔者实在是不想这么做的。于是乎,文章的名字从《为啥你的C/C++代码和别人的Java/C#/python/Ruby一样慢

其实我早就想写这样的文章了,但是,这个明显会挑起语言之争么。作为一个多年的版主,笔者实在是不想这么做的。于是乎,文章的名字从《为啥你的C/C++代码和别人的Java/C#/python/Ruby一样慢》改成了现在的。笔者日常工作主要使用C#,那写代码好爽啊,根本不用在乎程序的运行效率,因为怎么写都很慢。各种内存new了不用释放的特性被一个一个的语言采用,就和一个到处拉屎的宠物狗一样。最后你发现,总需要人帮他铲屎。 程序运行中需要各种各样的资源,使用了都要归还。而所谓的内存管理,垃圾回收中的内存只是其中的一种资源。其他的呢?文件你能不关么?socket你能不断么?锁你能不解么?这种半吊子的解决资源回收问题的方案,在笔者这种自诩完美主义者看来不是垃圾,就是拿出来骗人的!好了,牢骚发够了,让我们先看看激发我要写这一系列文章的最后一根稻草。
 
公司拿回了被外包到印度的一个项目,C#代码,我没事看看的时候,发现这么一个函数(有修改)
 
 
        static string RandomString(int length)
        {
            Random random = new Random();
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, length)
                .Select(s => s[random.Next(s.Length)]).ToArray());
        }
 


就是从某个字符集中随机产生一个字符串,让我们看看这堆狗屎到底做了什么。

首先字符集是 chars,然后要产生字符串结果的长度是length,这段代码将字符集复制了length次,然后从每一个副本中随机取一个组成一个列表,然后new 成一个字符串。各位吐了没有?还好这个字符集,只有26+10个。要整一个Unicode的话,这段代码直接要便秘了。 我直接想到的是有这么一种改进:
 
 
        static string MyRandomString1(int length)
        {
            Random random = new Random();
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Range(0, length)
                .Select(i => chars[random.Next(chars.Length)]).ToArray());
        } 


至少,这段代码不用复制字符集啊?

我直接把两个函数调用1万次,length=10000。然后一比。什么?居然耗时差不多?(此处我放一个书签,也就是我们这篇文章的point)。

当时我认为,C# release 优化的还不错啊。于是乎写下第二个 乡民版

 
        static string MyRandomString2(int length)
        {
            Random random = new Random();
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; ++i)
            {
                sb.Append(chars[random.Next(chars.Length)]);
            }
            return sb.ToString();
        }

 
果然这段代码在性能是轻松碾压上两个。Intel 公司长舒一口气,果然 你是我的最好代言,要想使用语言新特性,请买酷睿最新第八代!
 
性能提升总是最诱人的,我下意识的想 如果用C++再写一遍,这帮C#代码要屁滚尿流到什么程度?
 
于是我就写了写,写C++的时候慢了很多,因为我还在乎性能,不能像C#那个随意拉随意撒了
 
        string cppRandom(int length) {
            static string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            static auto random = bind(uniform_int_distribution(0, chars.length() - 1), default_random_engine());
            string res;
            res.resize(length);
            for (int i = 0; i < length; ++i) {
                res[i] = chars[random()];
            }
            return res;
        }


写完后,满心欢喜的运行,结果发现 只比前两个linq版本 快不到四倍,比 乡民版快不到两倍。

才快一倍多,尼玛我受打击了,用不到linq,还要自己铲屎,才给我快不到两倍!!!!

如果牛掰的人现在已经知道原因了,这也是我前面留书签的地方。我不卖乖了,原因就是,

这么多函数貌似测试的是随机数产生器的性能!是不是 恍然大悟?是不是茅塞顿开?是不是有所回想?

这也就是本系列文章的引子,说起代码快慢,比较的时候最好不要参杂其他因素,上面的例子引入了随机数在测试函数里,就是问题。

于是乎,我就把几万(一万个太小了)个随机数先生成出来放在数组里,然后再测试,结果终于满意了。
本文所有涉及代码只贴片段,不提供完整代码。你是码农,不就是写代码的么?你应该还要感谢我,所有代码没有上截图。。。。
我从来不和别人争辩哪个语言好,你说你哪个语言好,大不了我就用C/C++把你的编译器,解释器虚拟机写出来,然后嵌入我的项目里(其实写都不用写,可能就是开源的,还是C/C++代码),再写写你那个语言的代码,反正写着也很快(不用担心铲屎什么的)。
 
当然,在某些特定情况下解释语言也很快,比如python的正则表达式解析匹配很快,几乎可以匹敌C++。所以,我现在经常把python嵌入到我的项目里,才几兆~
 
 
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

电解电容作为电子电路中的重要元件,其性能的好坏直接影响到整个电路的正常运行。因此,正确地测量电解电容的好坏对于保证电路的稳定性和可靠性至关重要。本文将详细介绍电解电容的测量方法,帮助读者了解如何准确地判断电解电容的好坏。

关键字: 电解电容 电子电路 性能

投入式液位计是一种常用的液位测量仪表,具有结构简单、安装方便、测量准确等特点。它通过测量液柱产生的静压力来间接测量液位高度,广泛应用于各种液体储罐、管道、水池等的液位测量。本文将详细介绍投入式液位计的使用说明。

关键字: 投入式液位计 液位测量仪表 性能

随着科技的飞速发展,嵌入式系统已经广泛应用于各个领域,如家用电器、工业机器人、医疗设备、汽车等。嵌入式系统具有低功耗、低成本、高可靠性等优点,因此受到越来越多的关注。嵌入式系统的核心是处理器,处理器的性能直接影响到嵌入式...

关键字: 嵌入式 处理器 性能

摘要:采用.Mg-Y2g3作为烧结助剂,利用光固化成形技术、结合气压烧结方法制备了高致密化程度和高性能的si3N4陶瓷。研究了.Mg-Y2g3烧结助剂总掺量对光固化成形si3N4陶瓷的相对密度、物相组成、显微结构、热学和...

关键字: 光固化成形 显微结构 性能

整流变压器与一般电力变压器的结构、性能、内部接线有很大区别,其容量表示方法在铭牌上也多种多样,有的铭牌上有额定容量,有的还注明形式容量、平均容量,有的注明多挡不同含义。整流变压器是一种用于将交流电转换为直流电的装置,通常...

关键字: 整流变压器 容量 性能

目前市场上,CPU主要是intel和AMD两大阵营,其中intel市场份额最大,也是CPU界龙头老大,自从AMD推出锐龙处理器之后,各项性能指标开始标上Intel平台,并且走性价比路线,如今相比intel平台差距在不断缩...

关键字: CPU 处理器 性能

虽然现在很多人表示,手机芯片性能已过剩,买手机不用管芯片,只要觉得好用,价格合适就行,买就是了,所以根本就不用管什么参数等。但手机芯片依然是最重要的核心部件,手机芯片档次就注定了一台手机的基础能力,所以了解手机芯片,依然...

关键字: 手机 芯片 性能

采用针脚式接口对应到主板上就有相应的插槽类型。CPU接口类型不同,在插孔数、体积、形状都有变化,不能互相接插。

关键字: CPU 针脚 性能

12月2日消息,日前,安兔兔公布了11月安卓旗舰手机性能排行,得益于换代的优势,天玑9200新旗舰登顶榜首,力压一众骁龙8+手机,成为目前安卓天花板。

关键字: 安兔兔 手机 性能

Arm宣布Neoverse再度进阶,新增两个全新的平台—Arm Neoverse V1平台以及第二代的N系列平台Neoverse N2,N2与V1未来将分别代表最高单芯片性能和最高单线程性能。Arm Neoverse全新...

关键字: ARM Neoverse 性能
关闭
关闭