达夫设备简单介绍

2023-10-26

前言

想到肯哥每天的Open话题,总能学到一些知识。怕忘记,所以我就当成博客记录一下了。今天要记录的是2023年6月5日,肯哥的技术交流群里面的一个代码。

肯哥话题

肯哥的原话:
 hello 又到了每天的open话题时刻,今天我们聊点技术的东西。恰好,今天早上我从某篇文章里面看到这样的一种代码写法,挺新奇的,来分享给大家。
那么问题来了,你敢向代码仓库里面提及这么“秀儿”的代码吗?撇开PR不说,你觉得这段代码的“优秀”主要体现在哪里?欢迎大家来参与讨论。

void send(uint8* to, uint8 from, uint16 count)
{
    uint16 n = (count + 7) / 8; 
    switch (count % 8) 
    { 
        case 0: do { *to = *from++; 
        case 7: *to = *from++; 
        case 6: *to = *from++; 
        case 5: *to = *from++; 
        case 4: *to = *from++; 
        case 3: *to = *from++; 
        case 2: *to = *from++; 
        case 1: *to = *from++; 
    } while (--n > 0); 
}

看到话题的第一感想

(1)说实话,一开始看到这个代码。感觉莫名其妙,如果是我遇到这个,肯定会骂,傻逼玩意,写这种垃圾。后来,我想,既然肯哥都故意拿出这个了,应该有讲究。我就一直在等待群里面的大佬们的讨论。
(2)然后,一位大佬直接说了四个字,达夫设备

何为达夫设备

(1)说实话,到现在还是没有特别明白。哈哈哈哈,不过本文只是一个普通的知识科普。感兴趣的可以去研究研究。
(2)我看到肯哥给出了肯定的回答之后,我马上在谷歌和chatgpt中展开了搜索。结果发现,这个是一个远古的设计思想。我们看,这个代码里面是不是有一个switch语句,但是里面却没有break,这样不就会一直执行下去吗?加上这个switch语句何必呢?
(3)而这个switch语句恰恰就是达夫设备的精华之处。这个叫做C语言里面case 标签的Fall through特性。这串代码就是利用这个特性提高代码执行速度。
(4)既然可以提高代码执行效率,那么提升结果如何呢?根据知乎大佬测试结果来看,进行 100000000 次求和过程中,循环展开(unroll)比正常情况(normal)快了大概 47 毫秒。这个是以如今的设备来的。所以显得优化不明显,如果是按照上个世纪的设备来说,优化可能会好很多。
(5)这个是群里面一位大佬将使用达夫设备和不使用达夫设备的代码生成的汇编对比:达夫设备使用与否的X86汇编对比
(6)从测试结果来看,使用达夫设备产生的汇编代码是116行,不使用达夫设备生成的代码只有28。可能有人就有问题了,怎么使用了达夫设备的代码汇编反而还多了呢?如果感兴趣,可以自己计算实际上执行的命令次数呀。
(7)推荐文章:
深入理解达夫设备达夫设备(Duff’s Device)效率真的很高吗?

达夫设备的优缺点

优点

<1>达夫设备,是利用了汇编的“在复制时最小化判断数和分支数”所用算法,来提高代码的执行速度。
<2>从性能方面来看,降低了在处理分支时,中断与刷新流水线的巨大运算开销,因而相较于简单、直接的循环代码,这段代码的执行效率较高。

缺点

<1>随着时代的发展,设备的能力增强,达夫设备所能带来的优化并不明显(如上文说了,进行 100000000 次求和过程中,循环展开比正常情况快了大概 47 毫秒)。
<2>代码可读性不高。
<3>因某些架构的流水线与分支预测机制有所差异,编译器无法识别达夫设备。这么写反而会造成代码执行速度变慢。
<4>如今的编译器技术越来越厉害了,编译器的优化很可能比使用达夫设备优化更好。

结论

(1)我个人认为,达夫设备有利于增加对于C语言实现理解。是特定时期的特定产物,在当今的社会,并不具备推广的意义。但是如果想深入C语言的实现,可以加深学习呀。
(2)这就像一段爱情,每个一段喜欢,都是一个美好的瞬间。虽然已经是过去式,但是也很美好呀。哈哈哈哈,突然感慨一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

达夫设备简单介绍 的相关文章

  • c语言中+ =和=+有什么区别

    点击上方蓝字关注我 了解更多咨询 c语言中 和 有什么区别 区别在于 是简写 a 1就是a a 1 并不是简写 a a直接对a的赋值 符号代表的是正负 完全可以省略不写 即a b其实就是a b 在用C 编程时 我经常混淆 和 前者实际上是我
  • Keras和Tensorflow(CPU)安装、Pytorch(CPU和GPU)安装以及jupyter使用虚拟环境

    微信公众号 数学建模与人工智能 Keras和Tensorflow CPU 安装 Pytorch CPU和GPU 安装 Keras和Tensorflow CPU 安装 一 安装我用的是清华大学源 二 深度学习模型保存与加载 三 错误 Tens
  • window.open完美替代window.showModalDialog

    var url http www baidu com var name 百度 var iWidth 1100 弹窗宽度 var iHeight 700 弹窗高度 var iTop window screen availHeight 30 i
  • 2019年数学建模国赛A题

    前几天中秋节比完了 选的A题 我们学校好多组都选了A题 C题的很少 大家都怕找不到数据 我们组刚开始觉得A B都能做 就是C题可能没有数据无法下手 加上之前做小区道路的时候 用了仿真软件解题 我觉得很不靠谱 我主要是写论文的 然后一起建了数
  • 山东理工大学第十五届ACM程序设计竞赛 R - Zyn的超能力

    Description Zyn 需要能量提高自己的超能力 有两种能量存在 超级能量和小能量 对于超级能量 Zyn 绝对不可以错过 而且努力的 Zyn 希望得到更多的小能量 但是 Zyn 每天最多可以获得 k 次能量 而且每个能量都会在第 x
  • 2020年高教社建模国赛真题A题--炉温曲线

    2020年高教社杯全国大学生数学建模竞赛题目 请先阅读 全国大学生数学建模竞赛论文格式规范 A题 炉温曲线 在集成电路板等电子产品生产中 需要将安装有各种电子元件的印刷电路板放置在回焊炉中 通过加热 将电子元件自动焊接到电路板上 在这个生产
  • 什么是思维导图?6 个开源免费的思维导图软件

    目录 15款思维导图工具推荐 什么是思维导图 6 个开源免费的思维导图软件 当前推荐 Freeplane 离线应用 有免安装版本 跨平台 目前 2023年 还在更新中 下载 https sourceforge net projects fr
  • 一个参数一张Excel表,玩转Pandas的read_excel()表格读取

    作者 黄伟呢 来源 数据分析与统计学之美 我觉得很有必要讲述这个文章 进行数据处理的第一步就是Python数据读取 但是你可能没想到 在进行数据读取的同时 我们其实可以配合相关参数做很多事儿 这对于后续的数据处理都是极其有帮助 read e
  • 碳排放混合预测模型(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 二氧化碳排放力争于
  • MATLAB实现函数拟合

    目录 一 理论知识 1 拟合与插值的区别 2 几何意义 3 误差分析 二 操作实现 1 数据准备 2 使用cftool 拟合工具箱 三 函数拟合典例 四 代码扩展 一 理论知识 1 拟合与插值的区别 通俗的说 插值的本质是根据现有离散点的信
  • C++连接sqlserver

    项目结构 ConsoleApplication cpp include
  • 美国大学生数学建模竞赛赛题特点

    美国大学生数学建模竞赛赛题特点 赛题灵活度高 内容广泛 反恐 防灾 环境 健康医疗 交通 新能源等等 开放性大 评价类问题多且复杂 离散型优化问题多 除A题 如 2016B太空碎片的处理 2018D电动车充电桩的优化 2019D卢浮宫疏散路
  • 2023年深圳杯数学建模A题影响城市居民身体健康的因素分析

    2023年深圳杯数学建模 A题 影响城市居民身体健康的因素分析 原题再现 以心脑血管疾病 糖尿病 恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病 以下简称慢性病 已经成为影响我国居民身体健康的重要问题 随着人们生活方式的改变 慢性病的患
  • 【数学建模】随机森林预测(Python代码实现)

    目录 1 参数 2 算例实现 2 1 算例 2 2 单目标预测 DecisionTreeRegressor 2 3 多目标预测MultiOutputRegressor 1 参数 n estimators 森林中决策树的数量 默认100 表示
  • 权重计算方法三:变异系数法(Coefficient of Variation)

    目录 1 原理简介 2 步骤详解 2 1 原始数据收集 2 2 指标数据正向化 2 3 数据标准化 消除量纲 2 4 计算变异系数 2 5 计算权重及得分 3 案例分析 3 1 获取原始数据 3 2 指标正向化 3 3 数据标准化 3 4
  • 【数学建模笔记 24】数学建模的时间序列模型

    24 时间序列模型 定义 时间序列是按时间顺序排列的 随时间变化且相互关联的数据序列 分析时间序列的方法构成数据分析的一个重要领域 即时间序列分析 一个时间序列往往是以下几类变化形式的叠加 长期趋势变动 T t T t Tt 朝一定方向的变
  • Mathematica函数大全

    一 运算符及特殊符号 Line1 执行Line 不显示结果 Line1 line2 顺次执行Line1 2 并显示结果 name 关于系统变量name 的信息 name 关于系统变量name 的全部信息 command 执行Dos 命令 n
  • 建模方法(十)-灰色预测模型GM(1,1)

    引言 灰色预测的主要特点是模型使用的不是原始数据序列 而是生成的数据序列 其核心体系是灰色模型 Grey Model 简称GM 即对原始数据作累加生成 或其它方法生成 得到近似的指数规律再进行建模的方法 灰色预测模型对于不同问题采用不同模型
  • matlab遗传算法(GA)详解(一)算法入门

    遗传算法 Genetic Algorithm GA 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种通过模拟自然进化过程搜索最优解 所找到的解是全局最优解 的方法 参数编码 初始群体的设定 适应度函数的设计 遗传
  • EasyV+UE创造数字孪生可视化新篇章!

    众所周知 UE是UNREAL ENGINE 虚幻引擎 的简写 由Epic开发 是世界知名授权最广的游戏引擎之一 EasyV是一款数据可视化应用平台 用户通过EasyV可以更高效的实现数据可视化项目搭建 产品内有丰富的模版 海量的组件 简单的

随机推荐

  • cmake错误:“未定义的引用”,“未声明的引用”

    描述 在编译代码的时候 经常会出现 未声明的引用 和 未定义的引用 之类的错误 原因 这种情况一般在编译的过程是不会出现问题 在链接的过程会出现这些问题 未声明的引用一般是头文件引入错误 或者找不到头文件 未定义的引用应该是找不到函数的实现
  • omv5-gitlab/gitlab-ce deploy

    omv5 gitlab gitlab ce yml example version 3 6 services web image gitlab gitlab ce latest restart always environment GITL
  • AWS架构图更新2019 - 最强大的AWS架构设计工具

    需要设计您的Amazon Web Services AWS 架构 今天我想介绍一下如何使用Visual Paradigm的云架构设计软件绘制AWS架构图快速而有趣 他们提供世界上最简单 最强大的AWS架构设计工具 全套AWS符号 创建专业的
  • Python-装饰器详解

    装饰器 介绍 在Python中 装饰器是一种特殊的语法 用于修改或增强函数的功能 装饰器是Python的高级特性之一 它允许我们通过在不修改原函数代码的情况下 添加额外的功能或行为 装饰器是一个函数 它接受一个函数作为参数 并返回一个新的函
  • 构建工具Maven/Gradle

    Maven Maven项目对象模型 POM 可以通过一小段描述信息来管理项目的构建 报告和文档的项目管理工具软件 Maven 除了以程序构建能力为特色之外 还提供高级项目管理工具 由于 Maven 的缺省构建规则有较高的可重用性 所以常常用
  • 微信小程序之微信登录

    在开发微信小程序的时候 我们经常需要用到微信登录 通过wx的接口来获取微信用户的信息 然后存储到我们数据库来创建属于我们系统的用户信息 所以我们就要使用到wx login wx getUserProfile 这两个方法 wx login w
  • 向量点乘叉乘等理解和应用

    https baike baidu com item E5 90 91 E9 87 8F 1396519 fr aladdin 1 标量和矢量 2 1 2 3 2 4 6 2 4 6 2 1 2 3 2 矢量和矢量的加减 三角形定则解决向量
  • 程序员3年5年10年三个阶段

    第一阶段 三年 三年对于程序员来说是第一个门槛 这个阶段将会淘汰掉一批不适合写代码的人 这一阶段 我们走出校园 迈入社会 成为一名程序员 正式从书本上的内容迈向真正的企业级开发 我们知道如何团队协作 如何使用项目管理工具 项目版本如何控制
  • 奇偶剪枝算法

    奇偶剪枝是数据结构的搜索中 剪枝的一种特殊小技巧 现假设起点为 sx sy 终点为 ex ey 给定t步恰好走到终点 如图所示 竖走 横走 转弯 易证abs ex sx abs ey sy 为此问题类中任意情况下 起点到终点的最短步数 记做
  • 弱网使用教程

    Network Emulation for Windows Toolkit 1 下载安装包 默认安装 下载地址 https drive google com file d 1jvviwEDRx2UtmpUxe1 Sy94E3wBao5Ot
  • 基于51单片机的红外解码器

    1 简介 本红外解码器是以MCS 51系列AT89C512片机为核心 将红外传感器接收的信号解析出来 LCD1602显示屏将解码数据显示出来 2 总体原理图 硬件组成 单片机最小系统 LCD1602显示屏 IR红外接收器 系统电源 3 程序
  • 数据结构---n皇后问题

    n皇后问题 题目描述 JAVA实现 力扣提交代码 n皇后问题 题目描述 对于四皇后问题的解 放置一个皇后 棋盘被占据的解为 很明显 每行只能放置 且只能放置一个皇后 代码中 queen row 1 来实现的 一个完整的示例 放第一个皇后 放
  • 抖音将会输给快手?时间会证明一切

    为什么快手产品的主界面上没有设置频道分类 这样带来的用户体验真的好吗 在快手一个月之前的员工大会上 入职不久的新员工赵波提出了这个疑问 这个问题不只是他一个人的 之前官方的解答是 不意给用户设置标签是为了保持界面简洁 不对内容做过多的评判
  • i.MX6ULL - 从零开始移植uboot-imx_v2020.04_5.4.70_2.3.0

    i MX6ULL 从零开始移植uboot imx v2020 04 5 4 70 2 3 0 目录 i MX6ULL 从零开始移植uboot imx v2020 04 5 4 70 2 3 0 前言 1 环境搭建 2 NXP官方原版UBOO
  • 一文解决VS Code安装、C++环境配置、OpenCV配置

    前言 本文包括VScode安装 C 环境配置以及OpenCV配置全过程 VS Studio配置OpenCV比较简单 可以直接使用OpenCV官网已有的用VS Studio编译器编译好的OpenCV库 但VS Code不能直接利用VS Stu
  • Android:基本程序单元 Activity

    Activity 概述 在 Android 应用中 提供了 4 大基本组件 分别是 Activity Service BroadcastReceiver 和 ContentProvider 而 Activity 是 Android 应用最常
  • QApplication与QCoreApplication

    QApplication GUI 程序中 有且仅有一个 QApplication 类 管理GUI程序的控制流和主设置 QApplication 包含主事件循环 所有来自窗口系统和其他源的事件将被处理和分配 它也处理程序的初始化 析构和提供会
  • **vue.esm.js?efeb:591 [Vue warn]: Invalid prop: type check failed for prop "data". Expected Array

    vue esm js efeb 591 Vue warn Invalid prop type check failed for prop data Expected Array got String 有可能是这几种情况
  • CyclicBarrier底层源码解析

    一 概述 前面我们讲解了ReentrantLock CountDownLatch Semaphore的源码 他们都是由AQS来实现的 而CyclicBarrier则是通过ReentrantLock Condition实现的 CyclicBa
  • 达夫设备简单介绍

    前言 想到肯哥每天的Open话题 总能学到一些知识 怕忘记 所以我就当成博客记录一下了 今天要记录的是2023年6月5日 肯哥的技术交流群里面的一个代码 肯哥话题 肯哥的原话 hello 又到了每天的open话题时刻 今天我们聊点技术的东西