美文网首页
测试~位运算符与普通运算速度区别

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

作者: storyWrite | 来源:发表于2023-12-26 11:41 被阅读0次

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

相关文章

  • 赋值运算

    算数运算符,前++与后++的区别: %与/:image.png 位运算符: 三元运算符:

  • 问题精选-Java

    一、&和&&的区别 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 二、Collection...

  • 阿里总结:java面试题基础

    4、&和&&的区别 答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 5、Collecti...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • java基础面试题

    int 有几个字节 4个字节 2、&和&&的区别 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(an...

  • 【003期】JavaSE面试题(三):JavaSE语法(1)

    一、& 和 && 的区别? &运算符有两种用法: 按位与 逻辑与 &&运算符是短路与运算。逻辑与跟短路与的差别是很...

  • Java中&与&&的区别

    一、定义 Java中&叫做按位与,&&叫做短路与。 二、区别 1、&既是位运算符又是逻辑运算符,&的两侧可以是in...

  • 基础运算符

    [使1. 按位与运算符(&](#1. 按位与运算符(&)[按位或运算符 | ](#2. 按位或运算符(|)) 1....

  • swift-位运算符

    1. 位取反运算符( ~ ) 位取反运算符(~ )是对所有位的数字进行取反操作 2. 位与运算符( &) 位与运算...

  • 位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作 位与运算符 位与运算符(&)可以对两个数的比特位进行...

网友评论

      本文标题:测试~位运算符与普通运算速度区别

      本文链接:https://www.haomeiwen.com/subject/pyjlndtx.html