时间绝对是我们拥有的最重要的资源。与其他资源不同,它不可恢复、不可阻挡、不可再生。在多个领域中,性能是用时间来衡量的。你做事有多快?希望好,但不一定。许多格言更喜欢时间而不是质量......快点打破东西。
说到代码,执行速度至关重要。如果您的应用程序运行缓慢,用户无疑会跳过它。大型网络玩家(尤其是电子商务零售商……)为 ms 而战,因为它价值数百万美元的收入。
绩效是人秒O相对。现在,反应性的标准很高。在 90 年代,我们可以等待几分钟才能加载页面。今天,超过 2 秒的第一次打印与 404 未找到相同。也许后者更好,因为它通常显示得更快。
我只会谈论代码,尽管性能涉及其他方面,如网络、硬件……等。我将列出一些与日常生活情况相似的常识性原则。
1. 一劳永逸
这是关于在一个框架或一个过程中多次使用时不重复其输出不会改变的过程。从技术上讲,这是通过缓存(也称为记忆)或简单地将结果存储到变量中(这也是一种简单的缓存形式)来实现的。但是,必须非常小心以确保新鲜度。缓存失效是计算机科学中最难的问题之一。此外,检索缓存值有时比重新计算它的成本要高得多。在某些情况下,CPU 计算比内存访问或对大哈希表的搜索操作更快,因此您最好重新计算。
因此,应在上下文中检查此一般经验法则,但它通常是有效的。
想象一个 Excel 工作表,您可以在其中计算:
A1=SUMPRODUCT(BigRangeOfCells); B1=A1*A1;C1=B1*A1
如果 BigRangeOfCells 中的一个小单元格发生变化,Excel 会刷新 A1、B1 和 C1 的值。
Excel要计算A1中的公式多少次?实际上它被称为6次。A1 中 1 个,B1 中 2 个,C1 中 3 个。
A1 公式的值会在刷新帧内发生多次变化吗?不。因此,A1 应评估一次并记住直到下一次更改。如果您是电子表格用户,由于缓存,您的日常生活会更轻松。你知道它吗?
2. 不要等待
如果某项任务需要时间来为您提供执行其他任务所需的输出,但这第一项任务并没有占用您,请继续执行其他独立任务。在家里,您需要等待洗衣机停止工作才能烘干洗衣物,但您可以在此期间做饭。
这个原则调用了两个概念,流水线和异步编程。
流水线主要用于硬件级别。这个想法是始终在本地占用资源,而不是等待整个过程完成才开始下一个。如果您现在正在烘干您的衣物,您的洗衣机是免费的,继续进行下一批,不要等待第一批的烘干结束……这就是想法。
异步是您不等待确认或返回的事实。您将继续烹饪午餐,直到您听到机器发出哔哔哔哔哔哔声。这是您的机器给您的承诺。
Javascript 事件循环模型(和 promises)是异步范式的一个很好的实现。
但是,如果可能是异步的任务需要您的支持怎么办?那就是你需要执行它。我们不再“完全”自由地做其他事情。这将我们带到下一部分。
3. 并行执行
当您做饭时,您可以不时切换到水槽并清洗器皿。您将在两项任务之间跳来跳去,最好这样做,特别是如果您不想在没有干净的容器的情况下准备午餐,或者不想用碳化餐清洁容器。
这是调用多线程和多处理。区别在于前者共享上下文(堆和堆栈),而后者分配单独的上下文。线程更容易协作,启动更轻,而进程更重,需要特殊的机制来相互通信(IPC,共享内存,数据库,文件系统......)但进程利用专用资源(内存、cpu 核心、缓存等),并且可以更安全、可靠且性能更好地执行繁重的任务。
异步和多任务都属于并发编程范式。现在你知道区别了。
你可以在分布式计算系统上走得更远,机器通过网络进行协作……这是整个学科。
4.只在需要的时候处理
如果你需要在你的一顿美餐中加一个鸡蛋,在最后一刻打破它。想象一下,您之前将其打破并放入杯子中等待。同时你记得你今晚邀请的你的朋友对鸡蛋过敏。你会免费打破鸡蛋。另外还要洗杯子……好痛啊!
这就是懒惰的概念。如果你可以延迟一个计算,那就去做吧。
通过将昂贵的账单封装到一个函数中并将其作为符号返回,很容易实现这一点。毫无疑问,一切都是一个象征。
动态类型语言,如 Python 或 JS,使这变得容易。
#代替
a = 重计算
返回一个#你不知道什么时候会使用'a'
#最好做
a = lambda:heavy_calculation #python
a = function(){ 返回重计算} #JS
返回一个#不要忘记告诉客户'a'现在是一个可调用的,即a()
5. 简单地做
最后,也是最重要的,简单地做事。最短路径是直线(但不是在曲面屏幕上)。
不要试图在早期阶段加入复杂的东西。以最直接的方式使您的产品功能齐全。之后,您可以进行改进。七爪网七爪网-专注于分销商城,小程序定制,网站开发,定制开发,成品源码的源码交易平台