首页 > 其他分享 >MIT 6.172 lec2笔记

MIT 6.172 lec2笔记

时间:2023-04-04 16:23:58浏览次数:30  
标签:计算 lec2 6.172 链表 循环 choose 测试 MIT 函数

本节课介绍了优化的一些法则

从以下四个方面介绍了优化法则

image.png

Data structures

包装与编码

包装的思想是把多个数据值存储在一个机器字中,而编码的思想是把数据值转换为需要更少比特表示的形式。例如日期字符串"September 11,2018"可以转换为下图中的结构体,其中year为13位,month为4位,day为5位:

image.png

增加额外属性

当要把链表A插入到链表B时,需要遍历到链表B的尾结点,这是个费时的操作。我们可以在链表B中增加一个属性记录尾结点的位置使插入操作达到常数级。

image.png

预先计算

下图计算二项式系数的函数性能很差,原因是当多次调用该函数时,做了许多无用的计算。

image.png

我们可以提前计算出每一个二项式系数,当要使用时,直接查表即可,如下图:

image.png

编译时初始化

设想一个场景,当程序调用上图的init_choose函数时,每次程序运行时都会计算一遍choose二维数组。这是没必要的,我们完全可以直接声明choose数组,以避免重复的计算。

image.png

但如果我们一个一个敲这些数据,那该多累啊!于是就有了元编程的思想,我们可以写一个程序,这个程序的输出就是上图中二维数组choose的声明。

image.png

缓存

缓存的思想太太太常见了,这里就不过多赘述了。

稀疏性

考虑矩阵乘以向量,如果矩阵中的零元素较多(稀疏矩阵),可以重新设计数据结构只存储非0元素以减少计算。

LOGIC

常数折叠与传播

当编译器的优化级别较高时,所有常量表达式都可在编译期计算出来(而不是在运行期)。

消除共用子表达式

image.png

上图中第四行的代码可以简化

代数恒等式

利用恒等式简化计算,下图是判断两个球是否碰撞的代码,用平方代替了开方:

image.png

短路

当已经知道结果时,没有必要继续无用的计算。

image.png

排序测试

考虑一系列的逻辑测试,排序测试的思想是优先测试那些经常成功的样例。由于逻辑运算符的短路性,可以减少计算,右图的性能更好,因为空格符和换行符出现的更为频繁。

image.png

创造快速路径

下图中是判断两个球是否碰撞的代码,增加了if语句创造快速路径。

image.png

结合测试

结合测试的思想是把多个测试结合为一个测试。

循环

代码移动

把不变的数据从循环中移出来以减少计算。这点在CSAPP中讲过。

哨兵

哨兵的作用是处理循环的边界问题。

循环展开

循环展开的思想是,让一次迭代计算多次,以减少迭代次数。

循环合并

把多个循环合并为一个循环。

消除不必要的循环

本质是减少循环次数。

函数

内联函数

内联函数可以减少函数调用时的开销。内联函数可以与宏一样高效。

消除尾递归

用迭代消除尾递归减少开销。

粗化递归

如下图,当数组规模较小时,直接用插入排序,规模较大时才用快速排序。

image.png

标签:计算,lec2,6.172,链表,循环,choose,测试,MIT,函数
From: https://www.cnblogs.com/Kyo-Kyo/p/17286815.html

相关文章

  • MIT Linear Algebra
    MITLinearAlgebra:按照列的方式进行多维向量的线性组合而不是用对应行和列的各元素的乘积和;......
  • 线程间数据传递之ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
    前言在JAVA中线程之间传输数据的方式有多种,而本文旨在探讨ThreadLocal及其衍生类的使用场景。使用场景业务系统的参数传递:在我们的业务系统中可能会用到许多公共参数,可能是用户的token信息,在我们链路中可能某一个方法需要用到它,那么我们又不想一层层的传递它。分布式系统要打......
  • 启动redis时,告警日志中出现“The TCP backlog setting of 511……”以及“overcommit_
    问题描述:启动redis时,告警日志中出现“TheTCPbacklogsettingof511……”以及“overcommit_memoryissetto0…..”警告,如下所示:系统:rhel7.9数据库:redis6.2.61、异常重现[[email protected]]#redis-serverredis6379.conf[root@leo-redis626-aredis-6.......
  • MIT6.1810的学习笔记
    Chapter0OperatingsysteminterfacesProcessesandmemory这一节主要了解一下基础的xv6中的systemcall其中fork是对进程本身进行操作的它复制当前进程的全部内容以及当前进程的fd表也就是说子进程会做和原进程相同的事且对相同的file进行操作。(需要注意,子进程......
  • ipmitool详解
    1、ipmitool(IPMITool)是一个开源的命令行实用程序,用于与基于IPMI(IntelligentPlatformManagementInterface)协议的远程管理控制器(RMC)通信。IPMI是一种硬件标准,它定义了一组接口和协议,用于管理和监控服务器等计算机系统。通过IPMI,管理员可以使用远程控制台、Web界面或命令行接口来......
  • 【RabbmitMQ安装步骤】
    安装安装:一、下载所需要的包linux服务器输入命令:erlang下载地址:rabbitmq/erlang-Packages·packagecloudrabbitmq-server下载地址:Releases·rabbitmq/rabbitmq-server·GitHub二、安装Erlangrpm-Uvherlang-24.1.7-1.el8.x86_64.rpmyuminstall-yerlangerl-v//查......
  • Git Commit Message 应该怎么写?
    原文链接:GitCommitMessage应该怎么写?最近被同事吐槽了,说我代码提交说明写的太差。其实都不用他吐槽,我自己心里也非常清楚。毕竟很多时候犯懒,都是直接一个-m"fix"就提交上去了。这样做是非常不好的,我也是自食恶果,深受其害。特别是查看历史提交记录时,想通过提交说明来了解......
  • overcommit_memory的简单学习
    overcommit_memory的简单学习背景前几天一个测试环境启动失败.总是有如下的提示:Nativememoryallocation(mmap)failedtomap12288bytesforcommittingreservedmemory.当时看free其实内存剩余总量还是有的.但是JVM启动总是失败.当时没有考虑太多.改了下参数......
  • 40、K8S-安全机制-准入机制之LimitRanger、ResourceQuota、PodSecurityPolicy(PSP)
    1、基础知识1.1、准入机制1.1.1、简介所谓的"准入机制",指的是经过了用户认证、角色授权之后,当进行一些写操作的时候,需要遵循的一些原则性要求。准入机制有一大堆的"准入控制器"组成,这些准入控制器编译进kube-apiserver二进制文件,由集群管理员进行配置。这些控制器中,最......
  • 项目一众筹网06_02给用户分配角色、执行用户角色的分配、提交的 只是我们选中的解决、
    项目一众筹网06_02项目一众筹网06_02文章目录项目一众筹网06_0209-Admin分配Role-执行分配-handler方法(执行角色分配的后端代码开始)隐藏域的东西,不用传,点击submit(提交)的时候就会传过去,如下图允许参数是空值10-Admin分配Role-执行分配-Service方法==重复问题==11-Admin分配Role-执行......