当前位置: 首页 > news >正文

浅谈Rob Pike的五条编程规范

又是一篇需要我们多些思考的文章~

简介下Rob Pike

Rob Pike是Unix的先驱,UTF-8的设计人,Go语言核心设计者之一。

Rob Pike的5条编程规则

原文地址:http://users.ece.utexas.edu/~adnan/pike.html

中文翻译

罗布·派克(Rob Pike)的编程五原则

  • 原则1: 你无法判断一个程序的时间消耗在哪里。瓶颈常常出现在意想不到的地方,所以在证明瓶颈确实存在之前,不要试图猜测并添加加速技巧。

  • 原则2:测试。在测试之前,不要调整速度,即使测试之后,除非一部分代码明显超过其他部分,否则也不要调整速度。

  • 原则3:当n很小的时候,花哨的算法很慢,而n通常都很小。花哨的算法具有大的常数。在你知道n经常变得很大之前,不要使用花哨的算法。(即使n确实变得很大,也要首先使用原则2。)

  • 原则4:花哨的算法比简单的算法更容易出错,而且更难实现。使用简单的算法和简单的数据结构。

  • 原则5:数据占主导地位。如果你选择了正确的数据结构并把事情组织得很好,那么算法几乎总是不言自明的。数据结构而不是算法是编程的核心。

派克的原则1和原则2重申了托尼·霍尔(Tony Hoare)的名言“过早的优化是所有邪恶的根源”。肯·汤普森(Ken Thompson)将派克的原则3和原则4重新表述为“当有疑问时,使用暴力手段”。原则3和原则4是KISS设计哲学的实例。原则5之前由弗雷德·布鲁克斯(Fred Brooks)在《人月神话》中提出。原则5通常被缩短为“编写使用智能对象的愚蠢代码”。

我的理解

罗布·派克的编程五原则为编程提供了重要的指导。

对于原则1,你无法判断一个程序的时间消耗在哪里。这个原则强调了性能分析的必要性。在尝试优化代码之前,你应该首先确定代码的哪部分是性能瓶颈。性能分析可以通过工具和技术来进行,例如使用性能分析器(profiler)来检测代码的热点。通过分析代码的运行时间和资源消耗,你可以找到需要优化的关键部分。

对于原则2:测试。这个原则强调了基准测试的重要性。只有通过测量代码的实际性能,你才能确定哪些部分需要优化。基准测试可以帮助你了解代码在不同输入和数据规模下的性能表现。在进行基准测试时,确保使用真实的数据和场景,以获得准确的性能数据。只有通过测量,你才能做出明智的优化决策。

对于原则3,当n很小的时候,花哨的算法很慢,而n通常都很小。这个原则提醒我们在选择算法时要考虑数据规模。对于较小的数据集,简单的算法通常表现更好,而且更容易实现和调试。花哨的算法可能在理论上具有更好的性能,但在实际应用中可能会受到常数因子和实现复杂度的限制。因此,在选择算法时,要根据实际的数据规模和问题要求来做出决策。

对于原则4,花哨的算法比简单的算法更容易出错,而且更难调试。这个原则强调了简单和清晰的重要性。简单的算法和数据结构更容易理解、实现和维护。花哨的算法可能涉及复杂的逻辑和数学操作,增加了出错的可能性并降低了代码的可读性和可维护性。在编程中,简单通常是一种美德,因为它减少了出错的可能性并提高了代码的可读性和可维护性。

对于原则5,数据占主导地位。这个原则强调了数据结构选择的重要性。选择合适的数据结构可以极大地影响代码的性能和可读性。数据结构决定了如何组织和访问数据,对于特定的问题和数据规模,选择适当的数据结构可以显著提高代码的性能。在选择数据结构时,要考虑数据的特征、访问模式和问题要求。通过选择合适的数据结构,你可以将算法的效率最大化。

总的来说,罗布·派克的编程五原则提醒我们在编程时要保持目标导向,避免过早优化,选择合适的算法和数据结构,以提高代码的性能和可维护性。这些规则强调了性能分析、基准测试、数据规模和简单性的重要性。通过遵循这些原则,你可以编写出高效、健壮和易于维护的代码。

相关文章:

浅谈Rob Pike的五条编程规范

又是一篇需要我们多些思考的文章~ 简介下Rob Pike Rob Pike是Unix的先驱,UTF-8的设计人,Go语言核心设计者之一。 Rob Pike的5条编程规则 原文地址:http://users.ece.utexas.edu/~adnan/pike.html 中文翻译: 罗布派克&#x…...

LeetCode 377.组合总和IV 可解决一步爬m个台阶到n阶楼顶问题( 完全背包 + 排列数)

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围 示例 1: 输入:nums [1,2,3], target 4 输出:7 解释&#x…...

C中volatile总结

在CPU处理过程中,需要将内存中的数据载入到寄存器中才能计算,所以可能涉及到一个问题,如果内存中的数据被更改了,但是寄存器还是使用的旧数据,这样就会造成数据的不同步。 一、volatile关键字的作用 使用volatile关键…...

asp.net班级管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net班级管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 asp.net班级管理系统 二、功能介绍 1…...

【Pytorch笔记】6.Transforms

pytorch官方文档 - transforms transforms需要使用计算机视觉工具包:torchvision。 torchvision.transforms:常用的图像预处理方法; torchvision.datasets:常用数据集的dataset实现,如MNIST、CIFAR-10、ImageNet等&am…...

nodejs+vue临沂特色产品销售平台elementui

从实际工作出发,对过去的临沂特色产品销售平台存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息 提高了工作的效率。 随着信息化社会的形成和微电子技术日新月异的发展,临沂特色产品销售平台是针对目前临沂特色产品销售…...

机器学习必修课 - 使用管道 Pipeline

目标:学习使用管道(pipeline)来提高机器学习代码的效率。 1. 运行环境:Google Colab import pandas as pd from sklearn.model_selection import train_test_split!git clone https://github.com/JeffereyWu/Housing-prices-dat…...

WEB各类常用测试工具

一、单元测试/测试运行器 1、Jest 知名的 Java 单元测试工具,由 Facebook 开源,开箱即用。它在最基础层面被设计用于快速、简单地编写地道的 Java 测试,能自动模拟 require() 返回的 CommonJS 模块,并提供了包括内置的测试环境 …...

Naive UI 文档地址

最近几天官网访问不了,自己用github pages 部署了个 官网 github pages...

在CentOS7系统中安装MySQL5.7

第一步:下载MySQL包 > wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm第二步:安装MySQL源 > rpm -Uvh mysql57-community-release-el7-10.noarch.rpm第三步:安装MySQL服务端 > yum install -y mysql-c…...

R语言通过接口获取网上数据平台的免费数据

大家好,我是带我去滑雪! 作为一名统计学专业的学生,时常和数据打交道,我深知数据的重要性。数据是实证研究的重要基础,每当在完成一篇科研论文中的实证研究部分时,我都能深刻体会实证研究最复杂、最耗时的工…...

【Docker内容大集合】Docker从认识到实践再到底层原理大汇总

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…...

算法题:摆动序列

这道题是一道贪心算法题,如果前两个数是递增,则后面要递减,如果不符合则往后遍历,直到找到符合的。(完整题目附在了最后) 代码如下: class Solution(object):def wiggleMaxLength(self, nums):…...

复习 --- QT服务器客户端

服务器&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> #include<QTcpSocket> #include<QMessageBox> #include<QDebug> #include<QList> #include<QListWidget> #in…...

Godot 官方2D游戏笔记(1):导入动画资源和添加节点

前言 Godot 官方给了我们2D游戏和3D游戏的案例&#xff0c;不过如果是独立开发者只用考虑2D游戏就可以了&#xff0c;因为2D游戏纯粹&#xff0c;我们只需要关注游戏的玩法即可。2D游戏的美术素材简单&#xff0c;交互逻辑简单&#xff0c;我们可以把更多的时间放在游戏的玩法…...

leetcode 热题 100

数组和字符串匹配 子串和子序列 原串&#xff1a;“abcabc” 子串&#xff1a;“abc”, 连续但不大于原串的字符串 子序列&#xff1a;“acc”, 字符来自原串且保持在原串中顺序不变的字符串 子排列&#xff1a; “aabbcc”, 字符来自原串且只能用1次,但可有不同排列顺序的字…...

Ae 效果:CC Lens

扭曲/CC Lens Distort/CC Lens CC Lens &#xff08;CC 镜头&#xff09;主要用于添加或移除摄像机镜头扭曲&#xff0c;比如桶形失真 Barrel、枕形失真 Pincushion以及鱼眼失真 Fisheye等。或者&#xff0c;用它来创建一些特殊的动画效果。 ◆ ◆ ◆ 效果属性说明 Center 中…...

【Redis】基础数据结构-quicklist

Redis List 在Redis3.2版之前&#xff0c;Redis使用压缩列表和双向链表作为List的底层实现。当元素个数比较少并且元素长度比较小时&#xff0c;Redis使用压缩列表实现&#xff0c;否则Redis使用双向链表实现。 ziplist存在问题 不能保存过多的元素&#xff0c;否则查找复杂度…...

QT 实现服务器客户端搭建

1. 服务器头文件 #ifndef SER_H #define SER_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QMessageBox> //消息对话框 #include<QList> //链表头文件QT_BEGIN_NAM…...

Javascript - 轮播图

轮播图也称banner图、广告图、焦点图、滑片。是指在一个模块或者窗口,通过鼠标点击或手指滑动后,可以看到多张图片。这些图片统称为轮播图,这个模块叫做轮播模块。可以通过运用 javascript去实现定时自动转换图片。以下通过一个小Demo演示如何运用Javascript实现。 <!DOCTYP…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...