2KB项目,专业的源码交易网站 帮助 收藏 每日签到

代码优化的最优方法

  • 时间:2019-06-10 09:38 编辑:2KB 来源:2KB.COM 阅读:536
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:Cod
英文原文:Code Optimization: The Optimal Way to Optimize

功能优化是代码中最大的要挟之一。

你可能在想,又有人在这么说了。我能了解。从字面意思可以明白地判别,任何类型的优化都是善事,所以你想把它学好是件很天然的工作。

不要离开大师,以为本人是更好的开发者。不要防止变成平常 WTF 中的 “Dan”,由于你置信代码优化是准确的工作(Right Thing to Do?)。在任务中你会为此喊到骄傲。

盘算机硬件愈来愈快,软件制造愈来愈轻易,但任何你盼望做到的容易的工作最初老是会花更长的时间,你因而而摇头(特地说一句,这类景象称为 Wirth 定律),决计天真烂漫。

你真是崇高,但别再如许了。

中止!

不管你在编程方面有何等丰厚的经历,你如许做都是在严重障碍本人的目的。

怎样会如许呢?让我们回到主题。

起首,甚么是代码优化?

凡是我们在定义它时,都假定我们盼望代码有更好的功能。我们会说经过编写或重写代码,到达尽量减少运用内存或磁盘空间,或最大限制减少 CPU 时间或收集带宽,或者尽量少的运用额定中心的目标。

实践上,我们有时分会默许另外一个定义:编写更少的代码。

可是以此为目的起首写出来的的代码常常成为他人的眼中钉。谁的眼中钉?多是下一个需求了解你代码的倒运蛋,乃至可能就是你本人。像你如许聪慧无能的人实在可以免自毁:坚持目的,但从头评价你干事的办法,就算它们在外表看起来没有问题。

所以代码优化如今仍是一个含混的术语。我们会鄙人面思索一些其它优化代码的办法。

我们先来听听高人的建议,一同探究 Jackson 著名的代码优化规矩:

  1. 不要如许做。

  2. (仅对专家而言!) 依然不要如许做。

1. 不要如许做:领导完满主义

我要从一个相当为难的极端例子Start。好久之前的一段光阴,我正在涉足出色的、鱼与熊掌不成兼得的 SQL 天下。问题是,那时我踩到了蛋糕却不再想吃掉它,由于它湿了而且Start闻起来像臭脚。

我正在涉足出色的、鱼与熊站不成兼得的 SQL 天下。问题是,那时我踩到了蛋糕…

请稍等。让我从我打的这个比如中恢复过去,并说明一下。

那时我正在为一个外部网使用程序做研发,我盼望未来有一天它能成为所任务的小公司的完整集成的管理系统。 它将为他们跟踪一切,而不像他们事先运转的系统,它不会丧失数据,由于它将由 RDBMS(关系型数据库管理系统)支撑,而不是其他开发职员运用的不成靠的、自产的、扁平的文件。我想从一Start就把各类工具设计得尽量智能,由于我有一块空缺的石板。关于这个系统的设法在我的脑海中像烟花一样爆炸,我Start设计表 - 给客户关系管理(CRM)的联络人表和他们的很多高低文的变更的表,管帐模块,库存,推销,内容管理系统(CMS),和项目管理, 这个系统我很快就会本人试用。

一切这一切都进展下来,朝开发和功能的标的目的,你猜对了,由于要优化。

我看到,工具之间(表现为表的行)在现实天下中可以有很多分歧的关系, 我们可以从跟踪这些关系中获益:我们可以保存更多地信息,并终极将营业剖析主动化到一切地方。鉴于这是一个工程问题,我做了一个仿佛是对舷?灵活性的优化。

在这一点上,主要的是要留意你的脸,由于我不会被追查义务,假如你的手掌打了你的脸。预备好了吗?我创立了两个表:relationship 及其有外键援用到的 relationship_type。relationship 可以指向全部数据库中的恣意两行,并描绘它们之间的关系的性质。

哦,同伴!我方才优化了灵敏性,活该地太多了。

实践上太多了。如今我有一个新问题:给定的 relationship_type 天然在每一个给定的行组合之间都不会成心义。固然一个人能经过与公司之间的招聘关系使得这变得成心义,可是这在语义上是绝对不能对等的。比方两个文档之间。

我们将只向 relationship_type 添加两列,指定可以使用哪一个表。 (假如你已猜测我想经过将这两列Mobile到一个援用 relationship_type.id 的新表来完成这一点,那末给你加分,如许做可以在语义上使用于多个表的关系,而无需反复表名。由于假如我需求更改表名,但遗忘在一切实用的行中更新,这会招致 Bug 的发生!后患无穷。)

幸运的是,在沿着这条路走了一段以后,我在一条线索风暴中被无意地打醒了。当我醒来时,我意想到我曾经或多或少地想法从头完成了 RDBMS 的外部的外键相干表。凡是,我爱好在半途而废的时辰,大呼“我是超神了”,但遗憾的是,列位,这并非我要说的优化办法之一。 遗忘这个失败的设定——这个设定带来的收缩差点毁了我的容易使用程序的后端,它的 DB 简直没有任何测试数据,简直不成用。

让我们退后一步,看看这里的很多权衡规范中的此中两个。一个是灵敏性,这是我的既定目的。在这类状况下,我的优化实质上是修建性的,乃至还不成熟:

(我将在我行将宣布的文章中提到,“多云,有过早优化的时机”)但是,我的处理计划却因过于灵敏而失败。另外一个怀抱规范,可伸缩性,是我乃至还没有思索过的,但如许最少免除了可能发作的附带的侵害。

没错,“心好累”。
这对我来讲是一个很好的经验,让我晓得了优化是怎么完整失败的。我的完满主义完全解体:我的聪慧使我发生了我所做过的最客观、最不明智的处理计划之一。

优化你的习气,而不是代码

当你在具有任务原型和测试套件以证实其准确性之前,偏向于重构,思索下将这类激动领导到其他标的目的。Sudoku 和 Mensa 是个不错的选择的,但或许一些实践上直接使你的项目受益的工具会更好:

  1. 平安性

  2. 运转时波动性

  3. 明晰度和编码风格

  4. 编码效力

  5. 测试有效性

  6. 功能分析

  7. 你的Tools包/ DE

  8. DRY(防止反复代码)

但要留心:优化这些特定Task之一都可能需求其他Task的价格来完成。最少,这是以时间为价格的。

在这里,很轻易看到写代码中几多存在一点艺术。关于上述任何一种,我可以通知你有关太多或太少被以为是错误选择的故事。谁在这里考虑也是高低文的主要构成部分。

例如,关于 DRY:在一个任务中,我接办了最少 80% 冗余语句的代码库,由于它的作者明显不晓得怎么和什么时候写一个函数。其他 20% 的代码是使人迷惑的自类似。

我的Task是增加一些功用。在一切要完成的代码中都需求反复一个如许的功用,而且将来的任何代码将必需细心的复制以应用新功用。

明显,只要为了我本人的脑筋明白(低价值)和任何将来的开发者才需求去实行重构。可是,由于我是将新的代码参加代码库,我起首写了测试,实行回归测试,以确保我任何的重构没有问题。现实上,只是如许做:我碰到两个错误,我不会留意到生成一切冗繁而隐晦的剧本输出。

最初,我认为我做得很好。在重构以后,我用一些容易的代码行完成了被以为是一个难点的功用,使我的老板印象深入。并且,程序功能整体上进步了一个数目级。但不久以后,统一位老板通知我,我进度太慢了,并且这个项目应当早就完成了。(潜台词:编码效力是优先思索的问题。)

留意:优化任何特定的[方面]将以就义其他方面为价格。最少,这是以时间为价格的。

我依然以为我的选择是准确,即便事先代码优化没有失掉老板的赞美。没有重构和测试,我想现实上可能要花更长的时间才干找到准确的路,也就是说,专注于编码速度实践上会障碍它的开展。(嘿,那是我们的主题!)

与我在我做过的一个小型项目任务比拟。在项目中,我测验考试了一个新的模板引擎,并盼望从一Start就养成杰出的习气,虽然测验考试新的模板引擎并非项目标终极目的。

我留意到,我添加的几个代码区域十分类似,并且每一个区域需求指向统一个变量三次,DRY警铃在我的脑海中响起,我Start试图用模板引擎找到准确的办法干事情。

现实证实,颠末几个小时的无后果的调试以后,我发明这个模板引擎不成能像我想象的那样。不只没有完满的处理DRY;基本没有任何一个处理计划!

我试图调剂本人的价值观,我完整毁坏了我的编码效力和幸福感,由于这条弯路招致我的项目破费了我那天可能获得的提高。

即便如许,我完整错了吗?有时,值得一点投资,特殊是在新的技术布景下,要更早地了解最好理论,而不是稍后。减少代码重写和撤消的坏习气,对吧?

不,我以为即便在我的代码中寻觅减少反复的办法也是不明智的,这与我在之前的处事中的立场构成了光鲜的比照。缘由是场景是一切:喂授一个小型项目中探究一个新的技术,而不是长久处理。一些额定的线路和代码反复不会损伤任何人,但失去专注,损伤了我和我的项目。

等等,所以追求最好做法多是一个坏习气?有时。假如我的首要目的是进修新的引擎,或者通俗的进修,是很破费的时间的:修修补补,找出束缚,经过研讨发明不相干的功用和问题。但我忘了这不是我的首要目的,这让我支出了价格。

这是一种艺术,就像我说的。而这类开发的艺术受益于提示,不要如许做。最少让你思索在任务时有哪些是有的价值,在你的任务场景中哪些又是最主要的。

那第二条规矩呢?甚么时分才干够实行优化?

2. 不要这么做了:有人曾经做过这些了

好的,不管是你仍是他人,当架构被设置好,数据流被思索明白并文档化,就能够Start编码了。

让我们把"不要这么做"扩大下:不要实行编码。

这听起来像是提早优化,但和此外优化纷歧样,这个十分主要。是为了不恐怖的 NIHS 或“Not Invented Here”综合征 - 假定你的优先级包含代码功能和最小化开发时间。假如没有,假如你的目的完整以进修为导向的话,可以跳过下一节。

有人会自认为是地从头创造方形车轮,就算像你我一样的老实谦逊的人,也会由于看法的不全面而犯如许的错误。了解仓库中每一个 API 和Tools的每一个选项,而且跟着它们的开展深化常识,做到与时俱进,这固然是需求非常多任务的。可是,这段时间的投入能帮你成为这个范畴的专家,让你防止像 CodeSOD 上的人一样,做各类无用的测验考试。

本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
上一篇:怎样启动一个项目
下一篇:奇虎360 和 go
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部