首页 > 其他分享 >测试~位运算符与普通运算速度区别

测试~位运算符与普通运算速度区别

时间:2024-04-15 11:27:05浏览次数:25  
标签:index const 运算 lamp1 运算符 lamp let 测试

1. 测试想法

在读js 红宝书的时候,在书上看到位运算属于底层运算比直接运算速度要快,因此想要验证下
红宝书原文.png

2.测试代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>测试位运算符速度</title>
</head>

<body>
  <script>
    const loopNum = 999999999
    const runNum = 50

    function loop (loopNum) {
      const start1 = performance.now()
      for (let index = 0; index < loopNum; index++) {
        let res = ~25
      }
      const end1 = performance.now()
      const start2 = performance.now()
      for (let index = 0; index < loopNum; index++) {
        let res = -25 - 1
      }
      const end2 = performance.now()
      // 多数情况下 位操作符更快 但是差距有限  仅有几十ms 百分之3左右 580 / 597 除非极限条件下 否则平常开发 基本无区别
      return {
        time1: end1 - start1,
        time2: end2 - start2
      }

    }
    const runData = []
    for (let index = 0; index < runNum; index++) {
      runData.push(loop(loopNum))
    }
    const finalRes = runData.reduce((a, b) => {
      const res = {
        time1: a.time1 + b.time1,
        time2: a.time2 + b.time2
      }
      return res
    }, { time1: 0, time2: 0 })

    console.log('测算结果', finalRes) // zdz-log
    console.log('测算平均值', finalRes.time1 / runNum, finalRes.time2 / runNum) // zdz-log




  </script>
</body>

</html>

3.测试结果

前面为位运算结果,后面为直接计算结果,计算运算次数9999999次,循环50次取平均值
虽然电脑运行状态在某一时刻都是不同的,实验并没有保证完全其余变量相同,但是结果大致是准确的
根据结果可以看出两者差距很小,在正常业务代码中的运算次数不会导致两者存在差距

结果1.png
结果2.png

4.位运算的一个应用

位预算在React中用作了状态标记和一些类型判断

优点

  • 节省内存:使用二进制可以将多个状态或类型合并到一个整数中,从而减少了存储这些信息所需的内存空间。

  • 提高效率:位运算操作相比于其他逻辑运算通常更加高效,可以在一条指令中完成多个状态或类型的判断和设置,从而提高了程序的执行效率。

  • 便于扩展:使用位掩码技术可以轻松地添加新的状态或类型,只需在现有的位上进行操作,而不需要重新定义数据结构。

  • 代码简洁性:通过使用位运算,可以将多个状态或类型的操作集中在一处,使代码更加清晰简洁,减少了重复的逻辑判断
    image.png

举个简单列子,如果要记录 两个灯泡的开关有几种方式

    1. 两个变量
let lamp1 = true
let lamp2 = false

// 修改 
lamp1 = false
lamo2 = true
  • 2.一个变量
let lamp = []
lamp.push('lamp1')
// 数组中无对应灯名字 代表关闭
lamp = lamp.filter(item => item === 'lamp1')

  • 3 使用位运算

通过常量预先定义对应状态 可以在一个变量上保存多个状态,而仅仅使用一个数值就可以做到

// 第一位0 与第二位0 代表灯1 灯2 都是关闭
const lamp1 = 0b10
const lamp2 = 0b01
const lamp12 = 0b11
let lamp = 0b00 
// 开启灯1
lamp = lamp | lamp1
console.log(lamp.toString(2))
// 开启灯2
lamp = lamp | lamp2
console.log(lamp.toString(2))
// 关闭灯1
lamp = lamp & ~lamp1
console.log(lamp.toString(2))

运行结果.png

标签:index,const,运算,lamp1,运算符,lamp,let,测试
From: https://www.cnblogs.com/coderzdz/p/18135524

相关文章

  • day02_我的Java学习笔记 (类型转换、+做连接符、变量自增自减运算、三元运算符、键盘
    Java语言基础知识1.类型转换1.1自动类型转换1.2表达式的自动类型转换1.3强制类型转换这里得出的结果为啥是-36呢???后面高级篇再细讲。2.运算符2.1算数运算符2.1.1基本算数运算符2.1.2案例:数值拆分2.2+符号做连接符【思考1】:a+'a'为啥......
  • Python 生成测试数据 - faker 模块
    Python生成测试数据-faker模块摘自:http://notes.zhengxinonly.com/posts/2023-09-04.htmlFaker是一个生成数据的Python库,Faker数据通常用于生成测试数据。初始化操作首先需要安装faker模块pipinstallfakerfaker.Faker()创建并初始化一个伪造的生成器,该伪造器......
  • 黑盒测试用例设计技术-语法测试原则及案例
    语法测试用例设计原则选项导出原则:当语法规则强制选择时,为该选择的每个备选方案导出一个测试用例(“选项”)。最小与最大重复次数原则:当语法规则强制执行最小重复次数时,应为此导出至少两个测试用例:一个满足最小重复次数,另一个不满足(小于最小重复次数)。当语法规则允许最大重复......
  • MedSAM环境搭建&推理测试
    引子之前分享过一篇SAM(感兴趣的,请移步https://blog.csdn.net/zzq1989_/article/details/135479818?spm=1001.2014.3001.5502)环境搭建&推理测试,虽然话说SegmentAnything,但是原始模型对于一些子领域的效果还是不尽如人意的。最近医学领域的分割引起了我的注意,调研了一圈,也想看看在......
  • 结对编程--四则运算
    前言按照结对编程的原则,我和小组另一个成员进行了结对编程。我们开发的结对项目是小学的四则运算生成器。具体来说,我们开发了一个程序,用于随机生成四则运算题目,供学生答题,并返回答案的正误。在讨论后,我们决定使用C++来开发这个控制台程序,因为C++具有优秀的计算功能,并且能够在......
  • 30 天精通 RxJS (18):可观察运算符 - switchMap, mergeMap, concatMap
    今天我们要讲三个非常重要的operators,这三个operators在很多的RxJS相关的library的使用示例上都会看到。很多初学者在使用这些library时,看到这三个operators很可能就放弃了,但其实如果有把这个系列的文章完整看过的话,现在应该就能很好接受跟理解。OperatorsconcatMapconcat......
  • ansible 入门测试
    所有步骤均在ansibleserver主机上执行。安装ansiblewget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-7.repoyuminstallansible-ycansible到workder节点免密登录生成公钥ssh-keygen-trsa公钥拷贝到woker节点 *2 ssh-copy-i......
  • JMeter——异步请求性能测试
    前段时间任务要求要对一种异步请求做性能测试,异步请求步骤如下:step1:发一个数据计算的请求,response里面返回一个jobIdstep2:带上这个jobId,就可以实时查看这个请求返回的jobStatus,如果jobStatus==0,则成功返回计算结果;如果jobStatus==2,则代表jobinprogress;如果jobStatus==......
  • python四则运算生成器
    合作伙伴:2252717在编程任务中,清晰地理解并规划设计思路是至关重要的。对于这个特定的四则运算题目生成器,目标是创建一个程序,能够随机生成包含两个运算符的数学题目,这些题目涉及100以内的数字,并确保所有生成的题目的答案都在0到100之间。以下是我在设计和实现这个程序时遵循的详细......
  • 结对编程--四则运算(Python)
    合作伙伴:2252720`importrandomdefgenerate_expression():operators=['+','-','×','÷']#可用的运算符operator=random.choice(operators)#随机选择一个运算符ifoperator=='+':num1=random.randint(0,100)#生成第一......