普通视图

通用型AI考试教练 Prompt(适用于各类考试)

《一个通用的 AI 考试备考 Prompt 模板》 《适用于任何认证考试的 AI 刷题 Prompt》 《通用型 AI 考试教练 Prompt(适用于各类考试)》 《一个适用于任何考试的 AI 备考 Prompt》 《把 AI 变成你的通用考试教练》 《我用这个 Prompt 备考各种认证考试》 《一个能用于任何考试的 AI 教练 Prompt》 《用一个 Prompt,搞定各种考试复习》 《通用考试刷题 Prompt:让 AI 当你的私人教练》 《可复用的 AI 考试训练 Prompt 模板》 《通用考试练习 Prompt:让 AI 按考试标准出题》 《一套可迁移的 AI 考试备考 Prompt》
我使用了下面这个提示词来准备我的 Microsoft Azure 考试,比如 AI-900 和 DP-900,我发现它们特别有用。事实上,这个 prompt 可以用于任何类型的理论考试,并不仅限于 Azure 相关考试。例如,它也可以用来准备驾驶理论考试或 Life in the UK 考试。 你是我的 _________ 考试教练。请一次给我 60 道题(逐题给出,题型混合单选题和多选题)。在每一道题之后,我会先作答——然后你需要告诉我我的答案是否正确,并简要解释正确答案,以及为什么其他选项是错误的。请记录我答错的题目。 当最初的 60 道题完成后,请再次提问我之前答错的那些题目,直到我把所有题目都答对为止。题目需要按顺序编号(1、2、3……到 60,然后 61、62、63……),直到我全部正确回答为止。 请不要重复题目,并确保尽可能覆盖考试大纲中的各个知识点。你不需要询问我是否继续。在完成 60 道题之后,请评估我是否有通过考试的可能性。 请随机化答案选项顺序,并且不要以任何形式提示正确答案。 PS: 请将 __________ 替换为你的考试名称,例如:“Microsoft AZ-204” 原英文的Prompt:
You are my _________ Test Coach. Please give me 60 questions, one at a time (mixed with questions of single answer and multiple answers). After each question, I will answer — then you will tell me whether my answer is correct, and provide a brief explanation of the correct answer and why other answers are incorrect. Keep track of any questions I get wrong. After the first 60 are done, ask me those incorrect ones again until I answer all of them correctly. Number the questions sequentially (1, 2, 3… up to 60, then 61, 62, 63…) until I’ve answered everything correctly. Please don't repeat the questions, make sure you cover as many areas of the exam topics as possible. You don't need to ask me confirmations to continue. Estimate if I can pass the test after 60 questions. Do randomize answers, and Do NOT hint answers in anyway. PS: Fill the __________ with your exam name, for example: "Microsoft AZ-204"
祝你考试顺利! 比如:以下是ChatGPT在接受到这个提示词后变身为我的考试辅导教练。 [caption id="attachment_70839" align="alignnone" width="883"]ChatGPT考试教练 ChatGPT考试教练[/caption] [show_file file="/var/www/wp-post-common/justyy.com/prompt.php"] 英文:Prompt Engineering: Sharing a Prompt for Preparing Your Exams

相关文章:

  1. ChatGPT 使用 Promise.All 重构/重写代码(并行发送请求) 在我的一个项目中, 我有以下代码(Node/Javascript), 它(顺序)调用了一些 API. 这些 HTTPS 请求其实是可以并行完成的, 因为它们相互独立. 然后结果会被聚合到一个数组中. 我知道可以用Promise.all来把这些请求并行化, 我就问了ChatGPT怎么弄, 看看它是否能理解并给出正确的代码: 我先用英文问 ChatGPT-3.5: Rewrite...
  2. 推荐一款程序员性价比高的机械键盘 KeyChron K8 程序员性价比高的机械键盘 Keychron 我第一款 keychron 键盘是四年前(2020年)买的,当时在AMAZON工作,通过公司经费报销的。当时还问了经理,需要节俭么?因为亚马逊的16条军规中的一条就是节俭/Frugal。当时经理说,只要能提高你的工作效率就行,我也没太敢搞太贵的,最后面只挑了一个60多美元的机械键盘,型号是: Keychron C2 Wired Mechanical Keyboard, RGB Backlight / Gateron Mechanical...
  3. 今天去听了NHS举办的关于男性PSA/前列腺健康的活动/讨论 自从步入40岁之后,我时不时就会收到NHS或家庭医生(GP)的关怀提醒,建议我关注自身健康。毕竟,四十岁以上的男性开始容易被一些健康问题困扰,比如前列腺(PSA)指数、尿酸水平、血糖等。 40岁以上男性的NHS健康体验 今天刚好有些空闲,于是抽时间参加了NHS组织的前列腺健康活动。这项服务是以Drop-in形式进行的,中午2点到6点之间可以直接去GP诊所,不需要预约。医生会帮你测量血压、身高和体重,计算BMI指数。 接待我的是一位中年女医生,虽然上了年纪,但非常温柔细心。她给我连续测了三次低压血压,分别是89、91、87。测完前两次血压,她建议我先去称体重——我的身高是174cm,体重是81kg,BMI为26,略高了一点。实际上,我每天晚上睡前称重时体重通常还会比这个多2-3公斤。 随后GP帮我安排了下周的进一步体检,可能还需要抽血。她提到将评估我未来十年患癌风险的概率,如果风险较高,将会安排后续的观察或预防措施。 关于前列腺和PSA的知识分享 当天晚上6点,NHS还组织了一场线下答疑会,由一位男医生主讲(包括我有三个男性参加,并没有想象中的多),介绍关于前列腺健康和PSA检测的知识。由于公司有会议,我晚到半小时,但仍收获不少重要信息。 现场有一位负责组织的护士发了两本小册子,一本是关于PSA的健康指南,另一本则是介绍剑桥当地可参与的健康活动,比如瑜伽、足球等。 医生解释说,PSA检测并非百分百准确,可能出现假阳性(PSA高但无癌)或假阴性(PSA正常但有问题)的情况。PSA升高不一定意味着患癌,PSA正常也不能完全排除风险。 他建议男性朋友们要保持规律运动,减少烟酒摄入,有助于降低患前列腺癌的风险。另外,规律的性生活和射精也被证实有一定保护作用。 大家要更加关爱自己的健康。前列腺癌是英国男性第二常见的癌症,每年有超过5万人被诊断,死亡人数超过1万。虽然50岁以下患病概率较低,但随着年龄增长,风险会显著上升。对于50至69岁的男性,建议每年进行筛查,包括PSA抽血、肛门指检,必要时还需做活检(Biopsy,听说这个比较不舒服)以及MRI核磁共振检查。 我自己的PSA值常年略高,医生说这有可能是前列腺良性增大。每个人的情况都不一样,仍需持续关注和定期检查。 本文一共 848 个汉字,...
  4. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  5. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  6. 区块链中Layer 1和Layer 2协议的简介 Layer 1 和 Layer 2 是用来描述区块链技术中不同层次或层的术语,每个层都在维护和扩展区块链网络方面有其独特的作用和特点。 Steem的底层协议是C++写的,也就是steemd,见证人(也就是STEEM上的矿工)在自己的节点服务器上跑这个软件,共同运行这个区块链。steemd上支持一个custom_json操作,也就是可以调用API向区块链上写任何数据,这样的话,DApp分布式应用程序就可以在STEEM区块链上存储数据了,而在custom_json上的协议就是Layer 2/第二层。 Layer 1:基础协议 Layer 1 指的是区块链网络的基础层。它包括定义网络规则和操作的核心区块链技术。Layer 1的关键特性和组成部分包括: 共识机制...
  7. 怎么样安全的清空主机服务器空间? 很多朋友都有自己的VPS主机, 如果想取消销毁主机的时候, 可以采用以下二种方法来销毁主机. 虽然很多云主机可以让你很方便的一键销毁主机, 但是实际上你不清楚你的宝贵数据有没有可能被找回, 理论上可能, 这种可能性很小很小. 因为我们并不清楚云主机商在销毁的时候有没有真正去把硬盘的数据清空了. 像我有点强迫症的, 我就是不希望我的一些数据(比如啥爱情动作片)泄露了. rm -fr / LINUX上的这个命令: #...
  8. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...

系统设计: Fan-out/Fan-in 并发模式

Fan-out / fan-in 指的是一种并发模式:将工作拆分为多个单元并行执行,然后在所有任务完成后进行同步。虽然它经常在无服务器(serverless)函数的语境中被提及,但这一概念并不局限于无服务器架构。 更广义地说,fan-out / fan-in 是一种通用的并发模式,适用于任何可以将任务分解为相互独立部分的场景,例如线程、进程、Actor、微服务,甚至分布式作业,并在之后将结果汇聚起来。其核心思想是在执行阶段将工作并行展开(fan-out),在收敛阶段对各个分支的输出进行协调和聚合(fan-in),而不依赖于具体的执行模型或底层基础设施。 [caption id="attachment_70812" align="alignnone" width="1653"]Fan-out / fan-in 指的是一种并发模式:将工作拆分为多个单元并行执行,然后在所有任务完成后进行同步。 Fan-out / fan-in 指的是一种并发模式:将工作拆分为多个单元并行执行,然后在所有任务完成后进行同步。[/caption] 在实际工程中,fan-out / fan-in 模式常用于提升系统吞吐量和资源利用率,尤其适合 I/O 密集型或可并行计算的场景。通过将一个复杂任务拆分为多个相互独立的子任务并同时执行,可以显著缩短整体处理时间;而在 fan-in 阶段,对各个子任务的结果进行统一汇总、排序或合并,则有助于保持业务逻辑的完整性与一致性。不过,这种模式也需要注意并发控制、错误处理以及超时与重试机制,否则容易在高并发场景下引入资源争用、级联失败或结果不一致等问题。因此,在设计和实现 fan-out / fan-in 架构时,应结合具体场景权衡并发度、系统复杂度与稳定性。 [show_file file="/var/www/wp-post-common/justyy.com/design.php"] 英文:System Design: Fan-out/Fan-in Concurrency Pattern

相关文章:

  1. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  4. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  5. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  6. 微信PC端程序占用了1.39 TB的空间! 快速清理微信占用空间 前两天我的 C 盘剩余空间突然变红了,我随手一查,竟然发现微信 PC 端程序居然占用了 1.39 TB 的空间,简直不可思议。在手机上,微信同样是名列前茅的“吞空间大户”,在 设置 → 通用 → 手机存储空间 里几乎稳居第一。 更离谱的是,这些空间大多并不是因为聊天记录,而是各种缓存文件、视频、图片和被动接收的文件所堆积起来的。平时我们只是点开看一眼,就算没保存下来,微信也会悄悄把它们留在本地,占据大量磁盘。尤其是群聊里转发的视频和文件,日积月累就成了一个“隐形黑洞”。...
  7. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. /** MySQL...
  8. 和孩子到英国Suffolk进行复活节Easter Egg Hunt 去年复活节刚好因为疫情 只能待在家里, 于是在院子里和家里藏好复活节Egg然后孩子找蛋. 前年去了到 Beth Chatto 花园找复活节彩蛋 今年疫情好转, 政府允许在室外活动, 于是驱车到了Suffolk进行复活节Easter Egg Hunt. 地址是: The Rotunda,...

通过了AI-900和DP-900两门微软认证考试! 新时代应该人手一个AI-900证书

昨天顺利通过了 AI-900(889/1000) 和 DP-900(850/1000) 两门微软认证考试。 [caption id="attachment_70626" align="alignnone" width="1024"]Microsoft AI-900 AI Fundamentals Microsoft AI-900 AI Fundamentals[/caption] 两场都是线下考试,AI-900 原定 11:30,DP-900 原定 13:30。我 10:30 左右到考场,运气不错,被允许提前开始,结果 11:30 就全部考完了。
Code 证书名称 证书号码 获得日期
AI-900 Microsoft Azure AI Fundamentals 7Z9DA9-388866 2025年12月19日
DP-900 Microsoft Azure Data Fundamentals CD4244-E236BG 2025年12月19日
一直觉得自己上了点年纪,脑子不如以前灵光了,但考试真的能涨点自信 🙂 准备方式也很普通:每天大约 1 小时,连续学习 3 周,就这样顺利通过。 唯一的缺点是考场离家有点远,开车单程四十来分钟(Peterbourg,距离27英理),路上困得不行 😅 到考场的时候,正好有个小姐姐刚从考场出来,情绪特别激动。当她被告知“考过了”的那一刻,整个人都绷不住了,喜极而泣。教官还很贴心地递给她一杯水,让她平复一下情绪,并说了一句 “Well done”,现场挺暖的。 这个考场考试科目很多,我媳妇这个月的考试也在同一个教室。等我两门都考完出来的时候,同屋的考生还都没出来。 继续学习吧,至少证明一件事:不是变笨了,只是需要一点系统的投入。 💪 PS:进考场时只能携带身份证件,需要拍照并通过安检。 PPS:已经定了下两门考试(SC-900安全还有AZ-900云),之后打算2026年每1-2月考一门。为了薅公司羊毛 我也是拼了[Lol] 我在内部系统填了一个表(用于统计),然后马上就收到了一封邮件祝贺,关键是抄送经理了,所以我只能在Teams上和经理说这事,他给我点了个小红心。

软件工程师需要考证么?

我以前说过搞计算机的可能不太需要考证,但是现在想法渐渐变了,我觉得是一个很不错的事情,能让学习变得有动力有规划,并且通过认证能让简历变得好看! 而且考试就是一种延时满足、努力学习后通过考试的那一刻(在考场电脑上提交后)还是很开心的,分泌多巴胺/内啡肽,很爽。 最最重要的是,微软员工考这些微软证书是免费的!但其实也不贵,初级证书考一次99美元(60几英镑)。我之前在AWS的时候公司也是免费让员工去考AWS的证书,只不过当时我没有想法、也没有去研究。

在 AI 新时代,几乎每个人都值得去考一个 AI-900 证书

不仅仅是程序员,很多产品经理,甚至销售人员,都非常适合去考一个 AI-900。这个证书不会要求你写模型、调参数,而是帮助你系统性地理解 AI 的基本概念和工作方式。 比如,当你在电梯里和客户闲聊时,你至少能分清楚什么是机器学习、什么是生成式 AI,知道大模型到底“聪明”在哪里,又有哪些边界和局限,而不是只能泛泛地说一句“我们也在用 AI”。 更重要的是,AI-900 帮助你建立一套正确的认知框架: 哪些场景适合用 AI,哪些不适合; AI 能提升效率,但并不等于万能; 以及在真实业务中,数据、成本和合规往往比算法本身更重要。 在这个人人都会被 AI 影响的时代, 掌握这些基础认知,已经逐渐从“加分项”变成了“必备技能”。 AI-900 正是一个成本低、门槛低,但回报很高的起点。

微软证书有效期

微软的一些基础认证是永久有效的,例如 AZ-900、AI-900、DP-900、SC-900。这类证书主要用于验证对云和 AI 基础概念的理解,不需要定期续期。感觉就是一次考过,终身受用。 而其它进阶类认证通常有效期为一年。在证书到期前约 6 个月,微软会开放续期通道,一般是通过在线完成一次相对简单的评估即可完成续期,而且是免费的。至于是否可以反复尝试直到通过,官方并未明确限制,但实际体验上通过难度并不高。 如果从求职角度来看,Expert 级别的证书更有含金量,例如 AZ-305(Solutions Architect Expert)和 AZ-400(DevOps Engineer Expert)。这类证书在找工作时尤其有帮助,特别适合工作经验相对较少、或者刚毕业、希望通过证书来增强简历竞争力的人。

怎么样准备考试

我一是让ChatGPT/Copilot帮我练习,这是我用的Prompt:
You are my Microsoft AI-900 Test Coach. Please give me 60 questions, one at a time. After each question, I will answer — then you will tell me whether my answer is correct, and provide a brief explanation of the correct answer. Keep track of any questions I get wrong. After the first 60 are done, ask me those incorrect ones again until I answer all of them correctly. Number the questions sequentially (1, 2, 3… up to 60, then 61, 62, 63…) until I’ve answered everything correctly.
还有就是看油管视频,在O’reilly上也有视频和教程,通过了还能有认证的Credly电子奖章/证书
O’Reilly (oreilly.com) 是一个知名的学习平台和出版商,专注于技术、软件开发、数据、人工智能、云计算和商业技能。 O’Reilly (oreilly.com) is a well-known learning platform and publisher focused on technology, software development, data, AI, cloud, and business skills.
对于不会的内容可以多问问AI。比如我就在考试当天问了ChatGPT last-minute cheat sheet:关于数据仓库的那些容易混淆的服务,比如:Azure Data Factory、Azure DataBricks、Azure Data Lake等。 Microsoft Learn上也有模拟题,不过题目有限,就50-60道题不停的重复,不会做的题专门的学习,每道题做过后可以立马查看答案,还有提供相关的链接学习。Microsoft Learn上有针对每个证书提供的Learn Path,照着进度学习即可。 总题来说,这些Fundamentals的课程并不难,通过了才能解锁下一些更难的证书,然后就可以去找/换工作了,比如Data Engineer、AI Engineer这些。 英文:Passing Microsoft AI-900 and DP-900 Certificates Today!

相关文章:

  1. 最后一天在谢大工作 2013年10月,我开始在谢大,也就是 University of Sheffield 工作. 这是个两年的合同, 是在一个欧盟项目下,公司暂时把我借调给大学.我的工作标题 是 Marie Curie Experienced Researcher 简单来说也就是研究员,也就是相当于国内说的 博士后(不是学位,只是份工作). 两年,...
  2. ChatGPT 使用 Promise.All 重构/重写代码(并行发送请求) 在我的一个项目中, 我有以下代码(Node/Javascript), 它(顺序)调用了一些 API. 这些 HTTPS 请求其实是可以并行完成的, 因为它们相互独立. 然后结果会被聚合到一个数组中. 我知道可以用Promise.all来把这些请求并行化, 我就问了ChatGPT怎么弄, 看看它是否能理解并给出正确的代码: 我先用英文问 ChatGPT-3.5: Rewrite...
  3. 推荐一款程序员性价比高的机械键盘 KeyChron K8 程序员性价比高的机械键盘 Keychron 我第一款 keychron 键盘是四年前(2020年)买的,当时在AMAZON工作,通过公司经费报销的。当时还问了经理,需要节俭么?因为亚马逊的16条军规中的一条就是节俭/Frugal。当时经理说,只要能提高你的工作效率就行,我也没太敢搞太贵的,最后面只挑了一个60多美元的机械键盘,型号是: Keychron C2 Wired Mechanical Keyboard, RGB Backlight / Gateron Mechanical...
  4. 今天去听了NHS举办的关于男性PSA/前列腺健康的活动/讨论 自从步入40岁之后,我时不时就会收到NHS或家庭医生(GP)的关怀提醒,建议我关注自身健康。毕竟,四十岁以上的男性开始容易被一些健康问题困扰,比如前列腺(PSA)指数、尿酸水平、血糖等。 40岁以上男性的NHS健康体验 今天刚好有些空闲,于是抽时间参加了NHS组织的前列腺健康活动。这项服务是以Drop-in形式进行的,中午2点到6点之间可以直接去GP诊所,不需要预约。医生会帮你测量血压、身高和体重,计算BMI指数。 接待我的是一位中年女医生,虽然上了年纪,但非常温柔细心。她给我连续测了三次低压血压,分别是89、91、87。测完前两次血压,她建议我先去称体重——我的身高是174cm,体重是81kg,BMI为26,略高了一点。实际上,我每天晚上睡前称重时体重通常还会比这个多2-3公斤。 随后GP帮我安排了下周的进一步体检,可能还需要抽血。她提到将评估我未来十年患癌风险的概率,如果风险较高,将会安排后续的观察或预防措施。 关于前列腺和PSA的知识分享 当天晚上6点,NHS还组织了一场线下答疑会,由一位男医生主讲(包括我有三个男性参加,并没有想象中的多),介绍关于前列腺健康和PSA检测的知识。由于公司有会议,我晚到半小时,但仍收获不少重要信息。 现场有一位负责组织的护士发了两本小册子,一本是关于PSA的健康指南,另一本则是介绍剑桥当地可参与的健康活动,比如瑜伽、足球等。 医生解释说,PSA检测并非百分百准确,可能出现假阳性(PSA高但无癌)或假阴性(PSA正常但有问题)的情况。PSA升高不一定意味着患癌,PSA正常也不能完全排除风险。 他建议男性朋友们要保持规律运动,减少烟酒摄入,有助于降低患前列腺癌的风险。另外,规律的性生活和射精也被证实有一定保护作用。 大家要更加关爱自己的健康。前列腺癌是英国男性第二常见的癌症,每年有超过5万人被诊断,死亡人数超过1万。虽然50岁以下患病概率较低,但随着年龄增长,风险会显著上升。对于50至69岁的男性,建议每年进行筛查,包括PSA抽血、肛门指检,必要时还需做活检(Biopsy,听说这个比较不舒服)以及MRI核磁共振检查。 我自己的PSA值常年略高,医生说这有可能是前列腺良性增大。每个人的情况都不一样,仍需持续关注和定期检查。 本文一共 848 个汉字,...
  5. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  6. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  7. 怎么样安全的清空主机服务器空间? 很多朋友都有自己的VPS主机, 如果想取消销毁主机的时候, 可以采用以下二种方法来销毁主机. 虽然很多云主机可以让你很方便的一键销毁主机, 但是实际上你不清楚你的宝贵数据有没有可能被找回, 理论上可能, 这种可能性很小很小. 因为我们并不清楚云主机商在销毁的时候有没有真正去把硬盘的数据清空了. 像我有点强迫症的, 我就是不希望我的一些数据(比如啥爱情动作片)泄露了. rm -fr / LINUX上的这个命令: #...
  8. 区块链中Layer 1和Layer 2协议的简介 Layer 1 和 Layer 2 是用来描述区块链技术中不同层次或层的术语,每个层都在维护和扩展区块链网络方面有其独特的作用和特点。 Steem的底层协议是C++写的,也就是steemd,见证人(也就是STEEM上的矿工)在自己的节点服务器上跑这个软件,共同运行这个区块链。steemd上支持一个custom_json操作,也就是可以调用API向区块链上写任何数据,这样的话,DApp分布式应用程序就可以在STEEM区块链上存储数据了,而在custom_json上的协议就是Layer 2/第二层。 Layer 1:基础协议 Layer 1 指的是区块链网络的基础层。它包括定义网络规则和操作的核心区块链技术。Layer 1的关键特性和组成部分包括: 共识机制...

理解C++中的std::transform_reduce及示例

理解 C++ 中的 std::transform_reduce 及示例

std::transform_reduce 是一个强大的 C++17 算法,它结合了 transformreduce(或 accumulate)的功能。它允许你对元素进行转换,然后使用二元操作进行归约,从而写出简洁高效的代码

语法

template<class InputIt1, class InputIt2, class T,
         class BinaryOp1, class BinaryOp2>
T transform_reduce(InputIt1 first1, InputIt1 last1,
                   InputIt2 first2, T init,
                   BinaryOp1 binary_op1,
                   BinaryOp2 binary_op2);

template<class InputIt, class T,
         class BinaryOp1, class UnaryOp>
T transform_reduce(InputIt first, InputIt last,
                   T init,
                   BinaryOp1 binary_op1,
                   UnaryOp unary_op);
  • 它可以对每个元素应用 一元转换(可选)。
  • 然后使用 二元操作对结果进行归约,如求和、求积或自定义组合
  • 在 C++17/20 中支持 并行执行策略

示例 1:求平方和

#include <iostream>
#include <vector>
#include <numeric>
#include <execution>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    int sum_of_squares = std::transform_reduce(
        std::execution::seq,   // 顺序执行
        numbers.begin(),
        numbers.end(),
        0,                     // 初始值
        std::plus<>(),    // 二元操作(求和)
        [](int x){ return x*x; } // 一元转换(平方)
    );

    std::cout << "平方和: " << sum_of_squares << std::endl;
    return 0;
}

示例 2:向量点积

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> a = {1, 2, 3};
    std::vector<int> b = {4, 5, 6};

    int dot_product = std::transform_reduce(
        a.begin(), a.end(),
        b.begin(),
        0  // 初始值
    );

    std::cout << "点积: " << dot_product << std::endl;
    return 0;
}

示例 3:并行 transform_reduce

#include <iostream>
#include <vector>
#include <numeric>
#include <execution>

int main() {
    std::vector<double> numbers(1'000'000, 1.5);

    double sum = std::transform_reduce(
        std::execution::par,  // 并行执行
        numbers.begin(),
        numbers.end(),
        0.0
    );

    std::cout << "并行求和: " << sum << std::endl;
    return 0;
}

关键点

  • transform_reduce 避免了为转换后的值创建中间容器
  • 支持 顺序并行执行策略。
  • 有两种主要形式:单个范围带一元转换,或者两个范围进行成对操作(如点积)。
  • 初始值是必须的,以正确处理空范围。
std::transform_reduce 可以让你的代码更简洁、更高效,尤其适合大数据集或并行计算场景。 [show_file file="/var/www/wp-post-common/justyy.com/cpp.php"] 英文:Understanding std::transform_reduce in Modern C++

相关文章:

  1. 简易教程: C++的智能指针 C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个...
  2. C++中的 const和constexpr 比较 C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr...
  3. 被动收入之: 微博红包 今年开始重新经营我的微博帐号 drlai 收到两笔微信红包,应该是来自于官方的支持,150元(成功提现到支付宝)。虽然这不能持久,也没多少,但毕竟实现了零的突破,意义重大。 如果流量上来,内容创作者可能会接受到比较多的赞赏,这也是一个比较简单的变现方法。这也能作为一种被动收入,不过如果不是头部网红,可能杯水车薪,但如果你有好几个类似这样的,也能积少成多! 在用户中心,微博用户可以每天登陆手机微博APP打卡,获取点数和少量的红包钱(几分钱),积少成多! 微博做些小任务可获得积分和几分钱。聊胜于无。 微博的主要盈利模式 微博的主要盈利模式主要包括以下几个方面: 广告收入:微博的大部分收入来源于广告,尤其是品牌广告和效果广告。广告形式包括信息流广告(类似于推文广告)、热门话题广告、开屏广告和视频广告。品牌和企业可以利用微博庞大的用户群和社交互动来提升曝光率、推广品牌和产品。 会员服务:微博提供的VIP会员服务,用户可以支付订阅费用来享受更多的特权,比如个性化的主题、特有的表情包、私密权限设置等。这些会员服务主要面向个人用户,提升其社交体验。 直播和打赏:微博提供直播平台,用户可以通过购买虚拟礼物来支持主播,微博会从这些打赏中抽取一定比例的分成。此外,微博与内容创作者分成,通过内容付费、知识付费等形式变现。 增值服务:针对企业和大V(拥有大量粉丝的用户),微博还提供增值服务,如账号认证、粉丝数据分析、精准推送、推广和营销工具等。这些服务帮助企业提升营销效果,同时也增加了微博的收入来源。 电商和导流:微博上有大量的电商导流业务,尤其是和明星、网红的合作推广。微博用户在浏览社交内容时,可以直接跳转到商品购买链接,微博通过这种方式赚取导流佣金。 游戏联运:微博也会与一些游戏公司合作推出联合运营的游戏,微博负责推广和流量引入,用户充值或付费时,微博可以获得一部分的分成。 这些模式相结合,使得微博能够在广告市场、内容创作和电商等多个领域获利。...
  4. 借助AI快速开源了N个小工具: 写代码越来越像做产品了, AI 真把我宠坏了(Vibe Coding) 程序员的未来?Vibe Coding + AI 一起上! 借助 AI 快速开源了三个小工具 最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了几个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行...
  5. 豪车的修理费用就是贵一些 去年买了保时捷卡宴SUV(Porsche Cayenne)后,我一直担心将来修车费用会很高。当时购车时,车厂做了一次全面保养,把车里里外外都清洁了一遍。虽然这辆车已经三年车龄,但看上去几乎和新车没区别。 在英国,三年以内的新车通常不需要做MOT年检。而且很多这类新车会通过PCP(个人合同购车)方式出租给车主。简单来说,就是车主每月支付一笔租金,租期通常为三年,期满后可以选择一次性付清尾款买下车辆,也可以继续换租一辆新车。 举个例子,如果一辆新车售价是10万英镑,车厂可能按未来三年折旧后的50%残值来计算每月租金。三年后,如果车主不想买断,车厂就会将车辆作为二手车卖出,回收那5万英镑的残值。这样一来,车厂基本不会亏钱。此外,PCP合同中还有附加条款,比如每年限行1万英里,超出的部分需要额外付费,这些内容都会写在合同里。 车龄到了三年,车辆需要首次做MOT年检,同时车辆的市场价值也会首次出现较大幅度的贬值(一般是50%,甚至更多)。修车厂老板告诉我,相比玛莎拉蒂等其他豪车,保时捷的保值率相对较高。 这一年我开这辆保时捷基本没出什么问题。今年年初做了年检,顺利通过。随后又做了一次常规保养,修车厂老板告诉我,前后刹车片已经磨损了80%–85%。我们住剑桥村里,开车比较多(上班、送娃、家庭旅游都要用车),一年大概能开1-2万英理。 几周后我将车送回去更换刹车片。修完后账单是将近900英镑。我觉得有点贵,车行老板解释说,不仅换了前后刹车片,还有一个前雷达的传感器掉进了车体内部,为了修这个传感器需要拆掉前保险杠等部件,花了6个小时人工费。 我当时质疑说为啥这次修这么贵,他说:“因为这是保时捷。”我说:“那和别的车有什么区别?”他说:“It is not the same.” 我说不都一样么,他说:“It is not...
  6. 重要通知: 弃用 FeedBurner RSS 请改用 https://justyy.com/feed 最近我发现原本的 RSS(/rss、/feed)没有按时更新。 进一步检查后发现这些地址都被 301 重定向到了 FeedBurner(https://feeds.feedburner.com/zhihua-xblog),而 FeedBurner 已经久未维护,偶有抓取失败或延迟,导致读者无法及时收到新文章。 造成这次重定向的原因是我们使用的第三方主题/插件(mytheme)里曾经内置了将站点 feed 转发到 FeedBurner 的功能。 当时之所以做 301...
  7. 被动收入可遇不可求 被动收入做大了, 就是创业了. 年轻的时候多想想, 积累知识和资源, 有时候真就需要一个想法和机遇. ...
  8. 把年假分成几周请完 – 工作不是全部 我的工作合同里写着 一年享有 25年工作日 带薪假期 这是比较好的福利之一. 搬家的时候请了三天 还有就是零零散散请了几天 比如 看GP 等等. 每年假期可以有 5天能移到 下一年使用 所以我就把剩下的请了 但是是每周请一天...

Parquet 文件简介: Python 读写 Parquet 文件实战

Parquet 文件入门 Python 读写 Parquet 文件实战 大数据存储优化:Parquet 格式解析 Python 数据分析必备:Parquet 文件处理技巧 列式存储揭秘:Parquet 文件与性能优化 使用 Python 和 PyArrow 处理嵌套 Parquet 数据 从 CSV 到 Parquet:Python 数据格式转换教程

什么是 Parquet 文件?

Parquet 是一种列式存储文件格式,优化用于大规模数据处理。它常用于 Apache Spark、Hadoop 和 Pandas 等大数据框架,以实现高效存储和快速检索表格数据。 Parquet 格式可以简单认为是CSV的转置/Transpose。不过CSV是文本的,而Parquet是二进制的。从存储方式上理解列式存储就像把行列交换,但需要注意 Parquet 是二进制、支持压缩和嵌套类型,不仅仅是“转置”。

为什么使用 Parquet?

  • 列式存储:按列存储数据,提高分析任务的查询性能。
  • 压缩:支持高效的压缩技术,减少存储空间。
  • 兼容性:可与多种数据处理框架配合使用。
  • 模式演进:支持增加或删除列而不破坏现有数据。

安装所需库

要在 Python 中使用 Parquet,需要 pandaspyarrow(或 fastparquet):
pip install pandas pyarrow

在 Python 中读取 Parquet 文件

以下示例演示如何使用 pandaspyarrow 读取 Parquet 文件:
import pandas as pd
import pyarrow.parquet as pq

# Parquet 文件路径
file_path = "example.parquet"

# 读取 Parquet 文件到 DataFrame
df = pd.read_parquet(file_path)

# 显示前 5 行
print(df.head())

写入 Parquet 文件

你也可以轻松地将 DataFrame 保存为 Parquet 文件:
import pandas as pd

# 创建示例 DataFrame
data = {
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 35],
    "city": ["London", "Paris", "New York"]
}
df = pd.DataFrame(data)

# 保存为 Parquet
df.to_parquet("output.parquet", engine="pyarrow", index=False)

处理嵌套数据

Parquet 支持嵌套数据,如列表或结构体。可以使用 pyarrow 直接读取:
import pyarrow.parquet as pq
from io import BytesIO

# 直接读取 Parquet 文件
table = pq.read_table("example.parquet")
df = table.to_pandas()
print(df.head())

总结

Parquet 文件在存储和处理大规模表格数据时非常高效。使用 Python 的 pandaspyarrow,你可以轻松地读取、写入并处理 Parquet 文件,用于数据分析、ETL 流程和大数据应用。 [show_file file="/var/www/wp-post-common/justyy.com/python.php"] 英文:Introduction to Parquet Files: Read & Write using Python

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  4. 如何通过二分查找搜索在区块链上根据时间戳定位区块? 前两天,我想查一下自己在 STEEM 区块链上一些重要记录对应的区块号,比如: 注册了我的账号 #4253590 成为见证人 #20190755 挖到我的第一个区块 #20390040 被孙宇晨大佬代理了 SP #41676911 收到一笔 DAO 收入...
  5. MySQL参数一键配置脚本: 有效提升数据库性能 我一直是自己租用VPS服务器,然后搭建各种服务,比如博客就是Apache2+MySQL数据库。一般来说就是默认参数,没有去管,不过最近发现MySQL的性能参数都很保守,不能发挥整个服务器的性能。 然后我就网上搜索了一下,根据参数配置建议,用ChatGPT写了以下Python和BASH脚本。只需要在需要优化的服务器上,跑一下该脚本,然后就会显示参数配置,然后直接把参数添加到MySQL数据库配置参数文件上: /etc/mysql/mysql.conf.d/mysqld.cnf 然后运行: service mysql restart 重启MySQL服务器。 运行了几周,发现效果很好,博客反应速度也快了很多,这很大原因是根据了内存增加了MySQL缓存大小。 Python脚本优化MySQL数据库参数 把下面的Python脚本存成 mysql_config.py 然后运行 python3 mysql_config.py...
  6. 英国抓捕比特币ATM主犯: 所有与法币挂钩的加密活动必须获得许可 英国查获比特币ATM主犯:所有与法币挂钩的加密业务必须持牌 案件回顾:比特币ATM运营者被判四年 在2025年2月,英国金融行为监管局(FCA)宣布成功起诉并判刑首位非法运营比特币ATM的个人——Olumide Osunkoya。该男子未经授权在伦敦多地运营加密ATM,处理交易金额达260万英镑。他曾试图注册合法业务但被拒,随后伪造身份文件绕过监管,最终被法院判处4年有期徒刑。 最新行动:7台ATM被查封,两人被捕 紧接着在2025年7月,FCA与伦敦警察再次联合行动,在西南伦敦多个地点查封7台非法加密ATM,并拘捕2人。FCA重申:在英国,没有任何加密ATM获得合法运营许可,所有涉及法币兑换的活动必须事先注册并获得批准。 英国FCA官网原文指出:“我们提醒所有经营者,若他们继续运营未注册的加密ATM,将面临刑事起诉。”(原文链接见参考资料) 为什么这些ATM是非法的? 在英国,只要涉及“加密货币 ↔ 法币”的兑换行为,就会被纳入《反洗钱条例(MLRs)》的监管框架。运营者必须: 向FCA注册为加密资产公司 实施KYC(身份验证)和AML(反洗钱)程序 接受FCA的持续监管与合规审核 未经注册即开展此类活动,属于违法行为。...
  7. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. /** MySQL...
  8. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...

使用原子 TAS 指令实现自旋锁

使用原子 TAS 指令实现自旋锁

使用原子 TAS 指令实现自旋锁 Implementing a Spinlock Using the Atomic TAS Instruction 从零实现自旋锁:基于 TAS 的最小同步原语 Building a Spinlock from Scratch with Atomic TAS 用 test-and-set 实现最简单的互斥锁 Implementing a Minimal Mutex Using Test-and-Set 自旋锁的底层原理:TAS、原子性与忙等待 Inside Spinlocks: TAS, Atomicity, and Busy Waiting 原子操作与自旋锁:用 C 语言实现线程同步 Atomic Operations and Spinlocks: Thread Synchronization in C 从原子指令到锁:全面理解 TAS 和自旋锁 From Atomic Instructions to Locks: A Complete Guide to TAS and Spinlocks 动手写一个自旋锁:tryLock / lockAcquire / lockRelease 全实现 Hands-On Spinlock Implementation: tryLock, lockAcquire, and lockRelease 你的第一个自旋锁:基于 C 语言的 TAS 实现 Your First Spinlock: A TAS-Based Implementation in C 原子交换与线程互斥:自旋锁实现指南 Atomic Exchange and Thread Mutual Exclusion: A Guide to Implementing Spinlocks
假设我们有一个 TAS(Take-And-Set)函数。该操作返回内存中原来的值,并以原子方式将其替换为新值。原子性(atomicity)意味着没有其他线程能够观察到中间状态;整个读-写操作是一体不可分的。 在 C++ 中,标准库函数 std::exchange 在逻辑上表现相同,但它不是原子操作。同步原语需要硬件级别的原子性。
int TAS(int* memory, int newVal) {
    int old = *memory;
    *memory = newVal;
    return old;
}
我们想使用这个原语来实现一个简单的自旋锁,包括:
  • lockAcquire()
  • lockRelease()
线程将调用这些函数来保护对共享变量的访问:
typedef struct {
    int lock;
} lockType;

typedef struct {
    int val;
} threadArgType;

void threadFunc(void* arg) {
    lockAcquire((static_cast<lockType*>arg)->lock);
    (static_cast<threadArgType*>arg)->val++;
    lockRelease((static_cast<lockType*>arg)->lock);
}

实现 tryLock

tryLock 函数尝试获取锁一次。如果锁为空(值为 0),TAS 将其设置为 1 并返回原值(0)。如果锁已被占用,TAS 返回 1。tryLock 函数是非阻塞的——它会立即返回。 因此 tryLock() 只有在 TAS 返回 0 时才会成功:
enum {
    UNLOCKED = 0,
    LOCKED = 1
}

int tryLock(lockType* lock) {
    // 如果之前已锁定返回 1,如果之前未锁定返回 0
    int old = TAS(lock->lock, LOCKED);
    return (old == UNLOCKED);   // true (1) = 成功获取锁
}

实现 lockAcquire()

普通的锁获取应当“自旋”直到 tryLock() 成功。这称为 自旋锁,因为 CPU 会忙等待。必要时可以加入短暂的 sleep。例如,sleep(0) 并不会真正暂停执行,而是让出 CPU,允许其他线程运行。 它通常用于实现跨线程的互斥自旋锁。
void lockAcquire(lockType* lock) {
    while (!tryLock(lockType* lock)) {
        // 自旋直到锁可用
    }
}
另一种实现:
void lockAcquire(lockType* lock) {
    do {
       if (tryLock(lockType* lock)) {
          break;
       }
    } while (1);
}
展开 tryLock:
void lockAcquire(lockType* lock) {
    do {
       int old = TAS(lock->lock, LOCKED);
       // 无论锁是否已被获取,锁都已设置为 LOCKED
       if (old == UNLOCKED) {
           break;
       }
    } while (1);
}
这是使用 TAS 实现的最简单方法。在实际系统中,我们可能会加入 pause 指令或退避策略,但基本思路是相同的。

实现 lockRelease()

释放锁时,持有者只需将锁变量写为 0。由于 TAS 是“设置新值并返回旧值”,它同样适用于释放锁:
void lockRelease(lockType* lock) {
    TAS(lock->lock, UNLOCKED);
}
或者使用简单的原子存储也足够,但由于 TAS 是我们唯一的工具,我们重用它。请注意,在这里重复释放锁是安全的,因为再次将其设置为 UNLOCKED=0 不会产生副作用。

总结

仅使用原子 TAS 指令,我们实现了:
  • 一个 tryLock() 尝试
  • 一个 lockAcquire() 自旋锁
  • 一个 lockRelease() 解锁操作
这种锁的实现方式对于理解低级并发、内存顺序以及高层互斥锁库的构建方式非常基础。 [show_file file="/var/www/wp-post-common/justyy.com/cpp.php"] 英文:Implement a Lock Acquire and Release in C++

相关文章:

  1. 简易教程: C++的智能指针 C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个...
  2. C++中的 const和constexpr 比较 C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr...
  3. 被动收入之: 微博红包 今年开始重新经营我的微博帐号 drlai 收到两笔微信红包,应该是来自于官方的支持,150元(成功提现到支付宝)。虽然这不能持久,也没多少,但毕竟实现了零的突破,意义重大。 如果流量上来,内容创作者可能会接受到比较多的赞赏,这也是一个比较简单的变现方法。这也能作为一种被动收入,不过如果不是头部网红,可能杯水车薪,但如果你有好几个类似这样的,也能积少成多! 在用户中心,微博用户可以每天登陆手机微博APP打卡,获取点数和少量的红包钱(几分钱),积少成多! 微博做些小任务可获得积分和几分钱。聊胜于无。 微博的主要盈利模式 微博的主要盈利模式主要包括以下几个方面: 广告收入:微博的大部分收入来源于广告,尤其是品牌广告和效果广告。广告形式包括信息流广告(类似于推文广告)、热门话题广告、开屏广告和视频广告。品牌和企业可以利用微博庞大的用户群和社交互动来提升曝光率、推广品牌和产品。 会员服务:微博提供的VIP会员服务,用户可以支付订阅费用来享受更多的特权,比如个性化的主题、特有的表情包、私密权限设置等。这些会员服务主要面向个人用户,提升其社交体验。 直播和打赏:微博提供直播平台,用户可以通过购买虚拟礼物来支持主播,微博会从这些打赏中抽取一定比例的分成。此外,微博与内容创作者分成,通过内容付费、知识付费等形式变现。 增值服务:针对企业和大V(拥有大量粉丝的用户),微博还提供增值服务,如账号认证、粉丝数据分析、精准推送、推广和营销工具等。这些服务帮助企业提升营销效果,同时也增加了微博的收入来源。 电商和导流:微博上有大量的电商导流业务,尤其是和明星、网红的合作推广。微博用户在浏览社交内容时,可以直接跳转到商品购买链接,微博通过这种方式赚取导流佣金。 游戏联运:微博也会与一些游戏公司合作推出联合运营的游戏,微博负责推广和流量引入,用户充值或付费时,微博可以获得一部分的分成。 这些模式相结合,使得微博能够在广告市场、内容创作和电商等多个领域获利。...
  4. 借助AI快速开源了N个小工具: 写代码越来越像做产品了, AI 真把我宠坏了(Vibe Coding) 程序员的未来?Vibe Coding + AI 一起上! 借助 AI 快速开源了三个小工具 最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了几个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行...
  5. 豪车的修理费用就是贵一些 去年买了保时捷卡宴SUV(Porsche Cayenne)后,我一直担心将来修车费用会很高。当时购车时,车厂做了一次全面保养,把车里里外外都清洁了一遍。虽然这辆车已经三年车龄,但看上去几乎和新车没区别。 在英国,三年以内的新车通常不需要做MOT年检。而且很多这类新车会通过PCP(个人合同购车)方式出租给车主。简单来说,就是车主每月支付一笔租金,租期通常为三年,期满后可以选择一次性付清尾款买下车辆,也可以继续换租一辆新车。 举个例子,如果一辆新车售价是10万英镑,车厂可能按未来三年折旧后的50%残值来计算每月租金。三年后,如果车主不想买断,车厂就会将车辆作为二手车卖出,回收那5万英镑的残值。这样一来,车厂基本不会亏钱。此外,PCP合同中还有附加条款,比如每年限行1万英里,超出的部分需要额外付费,这些内容都会写在合同里。 车龄到了三年,车辆需要首次做MOT年检,同时车辆的市场价值也会首次出现较大幅度的贬值(一般是50%,甚至更多)。修车厂老板告诉我,相比玛莎拉蒂等其他豪车,保时捷的保值率相对较高。 这一年我开这辆保时捷基本没出什么问题。今年年初做了年检,顺利通过。随后又做了一次常规保养,修车厂老板告诉我,前后刹车片已经磨损了80%–85%。我们住剑桥村里,开车比较多(上班、送娃、家庭旅游都要用车),一年大概能开1-2万英理。 几周后我将车送回去更换刹车片。修完后账单是将近900英镑。我觉得有点贵,车行老板解释说,不仅换了前后刹车片,还有一个前雷达的传感器掉进了车体内部,为了修这个传感器需要拆掉前保险杠等部件,花了6个小时人工费。 我当时质疑说为啥这次修这么贵,他说:“因为这是保时捷。”我说:“那和别的车有什么区别?”他说:“It is not the same.” 我说不都一样么,他说:“It is not...
  6. 重要通知: 弃用 FeedBurner RSS 请改用 https://justyy.com/feed 最近我发现原本的 RSS(/rss、/feed)没有按时更新。 进一步检查后发现这些地址都被 301 重定向到了 FeedBurner(https://feeds.feedburner.com/zhihua-xblog),而 FeedBurner 已经久未维护,偶有抓取失败或延迟,导致读者无法及时收到新文章。 造成这次重定向的原因是我们使用的第三方主题/插件(mytheme)里曾经内置了将站点 feed 转发到 FeedBurner 的功能。 当时之所以做 301...
  7. 换了个奥迪Q5大灯花了我1000英镑 我那辆奥迪Q5 SUV今年年检没通过,原因是左前车灯坏了,需要更换。车厂告诉我,光是订购零件就要700多英镑,加上人工费,总费用得1000英镑。但没办法,如果不修,车辆年检(MOT)就过不了,车也不能上路。 MOT是英国的机动车强制性安全检测(Ministry of Transport Test)的简称。 近侧前位置灯不工作 drl/位置灯集成(4.2.1(a)(ii)) Nearside Front Position lamp not working drl/position...
  8. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: // @justyy var request = require("request")...

为什么并行不是无限的: 简单解释 Amdahl vs Gustafson

Amdahl 定律 vs Gustafson 定律 — 完整教程、推导、应用场景及 Python 绘图

Amdahl 定律 vs Gustafson 定律:完整教程、推导、应用场景及 Python 绘图 理解并行加速:通过代码讲解 Amdahl 定律和 Gustafson 定律 并行计算基础:Amdahl 定律、Gustafson 定律及加速建模 并行加速原理:Amdahl 和 Gustafson 定律完整指南 并行扩展解析:推导并比较 Amdahl 和 Gustafson 定律 Amdahl vs Gustafson:并行加速完整指南(含 Python 代码) 并行性能建模:Amdahl 定律、Gustafson 定律及实际应用 学习并行加速:数学、直觉、应用场景及 Python 可视化 并行计算:必须掌握的两条定律(Amdahl & Gustafson) 工程师的并行加速:Amdahl 定律、Gustafson 定律及 Python 实现 从理论到代码:用 Amdahl 和 Gustafson 建模并行加速 实用并行加速指南:Amdahl 定律、Gustafson 定律及可视化 为什么并行不是无限的:简单解释 Amdahl vs Gustafson 并行加速真相:Amdahl 限制 vs Gustafson 扩展 并行计算神话与现实:Amdahl 和 Gustafson 的教训

引言

并行计算在现代计算中至关重要:多核 CPU、GPU、分布式集群、云工作负载、LLM 训练以及 HPC 模拟。 为了分析程序在更多处理器下能加速多少,主要有两种数学模型:
  • Amdahl 定律 — 固定规模工作负载的性能
  • Gustafson 定律 — 可扩展规模工作负载的性能
这两条定律并不矛盾,它们回答的是 不同的问题。 本教程涵盖推导、直觉、比较、实际应用场景,以及展示两条定律的 Python 绘图脚本。

1. 什么是加速比?

加速比衡量程序在 N 个处理器上运行速度提升多少: [math]S(N) = \frac{T_1}{T_N}[/math] 如果程序在一个处理器上运行 10 秒,两处理器运行 5 秒,则加速比为: [math]S(2) = \frac{10}{5} = 2[/math] 完美线性加速为: [math]S(N) = N[/math] 但实际系统存在串行瓶颈,这正是 Amdahl 定律和 Gustafson 定律描述的内容。

2. Amdahl 定律(固定工作量)

2.1 直觉

Amdahl 假设:
  • 总工作量保持 不变
  • 部分工作是串行的,无法并行化
设:
  • f = 串行比例
  • 1 - f = 可并行比例

2.2 推导

一个处理器的运行时间: [math]T_1 = T_s + T_p[/math] 定义: [math]f = \frac{T_s}{T_1}[/math] 因此: [math]T_s = fT_1[/math] [math]T_p = (1 - f)T_1[/math] N 个处理器的运行时间: [math]T_N = fT_1 + \frac{(1 - f)T_1}{N}[/math] 加速比: [math] S(N) = \frac{T_1}{T_N} = \frac{1}{f + \frac{1 - f}{N}} [/math] 其中 f 是串行工作比例,[math] 1-f [/math] 是可并行工作。Amdahl 公式也可以写成: [math] S(N) = \frac{T_1}{T_N} = \frac{1}{(1-p) + \frac{p}{N}} [/math] 其中 [math] p=1-f [/math],[math] f=1-p [/math]

2.3 当 N → ∞ 时的极限

[math]S(\infty) = \frac{1}{f}[/math] 如果串行比例为 10%(f = 0.1): [math]S_\infty = 10[/math] 即使处理器无限,也无法超过该值。

2.4 Amdahl 定律的实际应用场景

Amdahl 适合优化固定任务的 延迟
  • GPU 内核优化固定张量大小
  • 单次请求推理延迟降低
  • 视频编码、压缩、排序
  • 加速固定批量作业
  • 数据库查询加速

3. Gustafson 定律(可扩展工作量)

3.1 直觉

Gustafson 反过来问: “增加处理器,我能在相同时间内解决多大的问题?” 这反映了真实 HPC 工作负载:更多 CPU → 更高分辨率 → 更大模拟。

3.2 推导

假设程序在 N 个处理器上运行 1 个时间单位。 设:
  • f = 串行比例(按规模测量)
可并行部分随处理器数量扩展,因此其运行时间保持与 N 成比例。 一个处理器的时间: [math]T_1 = f + N(1 - f)[/math] 加速比: [math]S(N) = f + N(1 - f)[/math] Gustafson 公式的 “N 减” 形式: [math]S(N) = N - (N - 1)f[/math] 或者,如果定义并行比例 [math]p = 1 - f[/math],公式也可写为: [math]S(N) = f + N(1-f) = f + Np [/math] “N 减” 形式用 p 表示: [math] S(N) = N-(N-1)f = N - (N-1)(1-p) [/math]

3.3 解释

随着 N 增加,加速比趋近于: [math]S(N) \approx N(1 - f)[/math] 对于小串行比例,几乎呈线性增长。

3.4 Gustafson 定律的实际应用场景

Gustafson 适用于 吞吐量扩展 或可增加问题规模的工作负载:
  • 天气和气候模拟
  • 粒子模拟、CFD、有限元分析
  • LLM 训练:更多 GPU → 更长序列或更大模型
  • 大数据分析(Spark, Dask, Flink)
  • 蒙特卡洛模拟

4. Amdahl 定律 vs Gustafson 定律(比较表)

项目AmdahlGustafson
工作负载固定随 N 扩展
目标降低延迟增加吞吐量
加速比上限有界: [math]1/f[/math]近似线性: [math]N(1-f)[/math]
悲观/乐观悲观乐观
应用场景优化现有任务扩展大规模工作量

5. 实际应用场景(综合视角)

Amdahl(延迟优化)

  • 减少单次 LLM 查询推理时间
  • 加速数据库 join 操作
  • 固定张量 GPU 内核优化
  • 视频编码(相同视频)

Gustafson(吞吐量 / 扩展)

  • LLM 训练(扩展至更多 GPU)
  • 高分辨率天气模型模拟
  • 大数据 ETL 扩展
  • 科学 HPC 工作负载

6. Python 绘图脚本(显示两条定律)

下面代码生成 Amdahl 与 Gustafson 加速比曲线图。 可以调整 f(串行比例)和处理器数量 N。 脚本绘制两条曲线在同一张图上。 包括部分 [math]f[/math] 的值,例如串行部分: import numpy as np import matplotlib.pyplot as plt def amdahl_speedup(N, s): return 1.0 / (s + (1 - s) / N) def gustafson_speedup(N, s): return s + (1 - s) * N # Number of processors N = np.arange(1, 65) # Serial fractions to consider Serial = [0.05, 0.1, 0.2, 0.3, 0.5, 0.8, 0.9, 1.0] plt.figure(figsize=(10, 6)) for f in Serial: plt.plot(N, amdahl_speedup(N, f), linestyle='-', label=f"Amdahl Serial={f}") plt.plot(N, gustafson_speedup(N, f), linestyle='--', label=f"Gustafson Serial={f}") plt.title("Amdahl's Law") plt.xlabel("Number of Processors (N)") plt.ylabel("Speedup") plt.legend() plt.grid(True) plt.tight_layout() plt.savefig("parallel-speedup-amdahl-vs-gustafson.png") ## plt.show() 下面是 Amdahl 与 Gustafson 曲线图示。 [caption id="attachment_70445" align="alignnone" width="1000"]Amdahl 定律加速曲线 Amdahl 定律加速曲线[/caption] [caption id="attachment_70446" align="alignnone" width="1000"]Amdahl vs Gustafson 加速曲线 Amdahl vs Gustafson 加速曲线[/caption] [caption id="attachment_70447" align="alignnone" width="1000"]Gustafson 定律加速曲线 Gustafson 定律加速曲线[/caption]

图示解读

  • Amdahl 曲线迅速趋于平缓——受串行部分限制。
  • Gustafson 曲线几乎线性上升——适用于可扩展工作负载。
  • 串行比例 f 越高,两种模型差距越大。

结论

Amdahl 定律展示了固定工作负载下的并行 上限,适合延迟优化。Gustafson 定律展示了随工作负载扩展的并行 潜力
  • Amdahl 定律 → 固定规模工作负载 → 收益递减
  • Gustafson 定律 → 可扩展工作负载 → 近似线性加速
  • 结合使用理解硬件极限与算法特性
  • Python 工具使可视化直观易懂
它们共同构成现代并行系统性能分析基础,从 HPC 到 LLM 训练,再到 GPU 计算。 英文:The Truth About Parallel Speedup: Amdahl’s Limits vs Gustafson’s Scaling

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 力扣刷题获得一件衣服奖励(Leetcode DCC Winner) 我每天都在力扣上刷题。力扣有国服和美服,我两边都会打卡。每天打卡可以获得积分,而积分可以兑换各种礼物,比如T恤、卫衣、水壶,甚至可以用来抵扣一个月的会员费用。 我从2018年8月开始刷题找工作(当时去伦敦面试亚马逊),从那时起每年都会续费会员,费用是159美元,相当于每月13.25美元。我觉得这是对自己最值得的投资。买了力扣会员,就会有动力刷题、思考,通过不断练习让自己熟能生巧,保持一定的竞争力。 到目前为止,我已经用积分兑换了7-8件力扣的衣服,其中有2-3件是卫衣。国内的礼物我都寄到姐姐家。 前不久,我收到了力扣的邮件,说我获得了DCC奖励。我也不知道为什么会获得这个奖,随手回了邮件。没多久,就收到了一件新版的力扣衬衫。 英文:Leetcode DCC Winner T-shirt 本文一共 291 个汉字, 你数一下对不对. 力扣刷题获得一件衣服奖励(Leetcode DCC Winner)....
  4. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  5. 如何通过二分查找搜索在区块链上根据时间戳定位区块? 前两天,我想查一下自己在 STEEM 区块链上一些重要记录对应的区块号,比如: 注册了我的账号 #4253590 成为见证人 #20190755 挖到我的第一个区块 #20390040 被孙宇晨大佬代理了 SP #41676911 收到一笔 DAO 收入...
  6. 花钱让人换汽车钥匙的电池真是个智商税 今天想不到我这么聪明的人也被人狠狠的收了一把智商税. 今天被收智商税了, 去 Tesco 换车钥匙的电池. . 才发现如此的简单, 那人直接2分钟搞定2个, 然后收了我25英镑. . 服了. . 我还以为很复杂…… 网友说 “1....
  7. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...
  8. 和媳妇约个会: 剑桥的过桥米线 Dumpling Trees Dumpling Trees 是位于剑桥 Cherry Hilton 附近的一家中式餐厅,以云南特色的过桥米线闻名。店内环境宽敞整洁,菜品丰富,除了经典的米线,还有各类小吃、烧烤和炒饭,味道地道,分量十足。过桥米线的汤底鲜香,配料新鲜,包括鸡肉、鱿鱼、虾等食材,顾客可以自己下锅涮熟,既好吃又有趣。餐厅提供免费停车,但需在店内登记车牌,适合家庭聚餐或周末小聚。 剑桥 Cherry Hilton 那边有一家叫 Dumpling Trees 的过桥米线店,两三年前的冬天我们去吃过一次(剑桥 Dumpling Tree...

性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王)

性能隐藏的引擎:数据存放在哪里决定一切

1. 性能的真正秘密:数据放在哪里决定一切 2. 决定系统快慢的不是 CPU,而是数据的距离 3. 缓存才是现代计算性能的核心 4. 忽视数据局部性,一切性能优化都是徒劳 5. 性能瓶颈不在算力,而在内存层级 6. 数据局部性:被低估的性能决定因素 7. CPU 在等你的内存:缓存层级的真实代价 8. 系统速度快的真正原因:一切都与缓存有关 9. 别再关注 CPU 速度了——数据局部性才是制胜关键 10. 为什么缓存是所有高性能系统的幕后引擎 11. 性能的关键不在于 GHz,而在于距离 12. 你的 CPU 正在等待内存:缓存不为人知的故事 13. 数据局部性:计算机领域最重要却鲜为人知的因素 14. 数据存储位置决定一切 15. 缓存主宰一切:性能指南 16. 内存层次结构:性能的隐形杀手(或救星) 17. 为什么现代性能之战是与延迟的较量,而非与计算能力的较量
我们喜欢讨论 CPU 频率,但在实际系统中,关键问题是:你的数据存放在哪里? 现代 CPU 依赖一个分层的内存体系(寄存器 → L1 → L2 → L3 → DRAM)。L1 访问可能只需约 4 个周期;而 DRAM 访问可能需要 200+ 个周期——那是 50× 更慢。如果你的工作集能放进缓存,一切飞快;如果不能,CPU 就会阻塞等待。

为什么缓存主导一切

分组处理是一个典型例子。每个数据包都会触发表查找。如果这些表能保持在缓存中,你可以每秒处理数百万个包;一旦溢出到 DRAM,吞吐量会崩塌。
真正的设计问题: 它能放进缓存吗?
[caption id="attachment_70404" align="alignnone" width="476"]CPU寄存器/缓存/架构 CPU寄存器/缓存/架构[/caption] 缓存不仅仅关乎数据。指令缓存未命中也会毁掉尾延迟。有些高频交易系统会让热路径持续执行,只在需要发包时才打开网卡,从而保持 指令缓存持续命中。在交易环路中,一个 I-cache 停顿就可能占据全部延迟预算。

抽象失灵的地方

“全都上云”这类高层策略常忽略底层现实。虚拟化网络功能依赖于诸如:
  • 独占核亲和(core pinning) —— 保持线程在同一 CPU 上以维持缓存热度
  • 中断合并(interrupt coalescing) —— 降低中断率但以延迟为代价
  • NUMA 局部性 —— 跨插槽访问会严重削弱性能
  • 物理网卡与虚拟网卡 行为不同
销售演示会说“可以工作”,但细则通常是:需要 3 倍硬件、3 倍许可证,性能仍然无法与裸机匹配。 一旦你依赖缓存行为、核亲和和 NUMA 局部性,平台就不再可互换。

AI 也碰到同样的问题

即便在 AI 领域,物理规律也没变。模型越来越大,但数据移动依旧主导计算。局部性仍然是王道
  • 数组优于指针密集的结构,因为内存是连续的
  • 硬件预取器只有在访问可预测时才有用
  • 当内存布局合理时,缓存行被更高效地利用

在机器人控制中也能看到

在多轴运动控制中,第一个轴会“预热”缓存并承担缺失惩罚;后续轴的计算因为数据已经热化而耗时减半。相同的原理:局部性 = 速度。

IBM Telum:不同量级的缓存

IBM 的 Telum 处理器把这个想法推到了极端:
  • 十个 36 MB 的 L2 缓存
  • 360 MB 的虚拟 L3
  • 2.8 GB 的虚拟 L4
[caption id="attachment_70405" align="alignnone" width="480"]IBM Telum 处理器 IBM Telum 处理器[/caption] 该架构可以按需将 L2 转作 L3 使用。IBM 尚未公开这些缓存层的具体访问延迟,但在如此大规模的缓存下,大小、互连距离与命中延迟之间的折衷会非常有趣。

结论

性能归根结底由数据和指令能离核心多近来决定。 为局部性而设计,你的系统会表现出色。忽视它,再多的 GHz 或再多的云抽象也救不了你。
我们经常谈论 CPU 速度,却很少关注数据存储的位置。 性能主要取决于数据存储的便利程度。寄存器、L1 缓存、L2 缓存、L3 缓存、主内存——每一步都会增加延迟并降低吞吐量。访问主内存可能需要 200 个时钟周期,比 L1 缓存慢 50 倍。 当工作集能够放入缓存时,代码运行速度极快。否则,CPU 只能等待。 在数据包处理中,这种差异决定了一切。每个数据包都会触发表查找。如果这些表保存在 缓存 中,您可以每秒处理数百万个数据包。否则,吞吐量将急剧下降。 所以,下次设计数据结构时,请问问自己: 它能放进缓存吗? 因为在对性能要求极高的系统中,缓存不仅仅是一种优化手段,它定义了整个系统。 而且不仅是数据,指令也一样!我见过高频交易工程师讨论他们的策略,他们将热路径编程为始终处于激活状态,并且只在数据包需要离开系统时才启用网卡。这样也能保持指令缓存处于热状态。 保持指令缓存处于热状态与保持数据缓存处于热状态同样重要,尤其是在对可预测性要求很高的工作负载中。优化热路径,使 CPU 始终保持在指令缓存中至关重要,因为即使是很小的停顿也可能导致尾延迟显著增加。这很好地提醒我们,架构设计的真正目的是尽可能地将指令和数据都放在靠近核心的位置。 很多技术决策者都固守一刀切的策略:例如……万物皆可云——他们认为任何虚拟化工作负载都可以在任何虚拟化环境中运行,底层硬件和虚拟化技术都只是商品而已。但这并不适用于虚拟化网络功能,因为厂商们早就知道,独占线程核心绑定可以让执行线程独占使用 CPU 缓存。厂商们也知道,在虚拟化环境中,中断合并可以降低“CPU 使用率”,但会增加延迟。他们了解 NUMA 局部性,甚至把这些都写进了文档里。当然,销售人员来了之后,他们希望与高层战略保持一致,使用最佳优化基准测试,然后就云或虚拟机管理程序支持的问题展开另一场不加任何细节的讨论。没错,这行得通*但附注:你需要三倍的许可证/硬件,而且仍然无法获得最佳性能。人们对底层性能如此缺乏兴趣,技能差距如此之大,以至于似乎只能通过增加抽象层和厂商来掩盖责任。如果珠穆朗玛峰是检验技术领导力还是厂商责任的试金石,那么我们很想知道,究竟是哪一方会坚持到底,还是会在山脚下卖羽绒服。完全正确。一旦你依赖缓存行为、核心绑定和NUMA局部性,平台就不再具有可互换性了。底层细节远比大多数高层策略重要得多。 大多数繁重的AI工作负载仍然会遇到相同的内存层次结构限制。模型规模不断扩大,但芯片内部数据传输的物理机制并没有发生太大变化。理解局部性仍然是获得良好性能的关键。 数组能够为CPU提供它真正需要的东西:连续的内存和可预测的访问模式。这意味着预取器可以真正发挥作用,缓存行可以得到高效利用,并且避免了分散结构带来的指针追踪惩罚。这是保持缓存友好性的最简单方法之一。 机器人多轴运动控制也是如此。第一个轴预热缓存并承受缓存未命中的影响,下一个轴的计算时间缩短了一半。 IBM Telum处理器可以验证这一点,它能够按需将L2缓存转换为L3缓存,并且L4缓存可以被任何其他CPU访问。此外,该芯片的时钟频率始终保持在 5.5 GHz。它包含十个 36 MB 的二级缓存¹,以及扩展的虚拟三级缓存(360 MB)和四级缓存(2.8 GB)。 这是一款令人着迷的芯片。与大多数架构相比,其缓存容量巨大,这让我不禁好奇这会对各级缓存的访问延迟产生怎样的影响。可惜的是,我找不到任何关于 Telum 缓存的公开延迟数据,否则我很想了解 IBM 在实际应用中是如何平衡缓存容量、交换空间距离和命中延迟的。
英文:The Hidden Engine of Performance: It’s All About Where the Data Lives (Cache is the King)

相关文章:

  1. 英国银行透支申请/Overdraft详解: 以HSBC为例的真实申请经历 我在英国申请HSBC Overdraft的全过程与心得 什么是HSBC Overdraft?我的申请经验与使用体会 英国银行Overdraft详解:以HSBC为例的真实申请经历 英国HSBC Overdraft申请记:为啥我也办了个透支额度 账户差点扣不上学费,我才去申请了HSBC Overdraft 英国银行透支服务(Overdraft)到底有啥用?我的真实体验 理财角度看HSBC Overdraft:短期周转的小帮手 透支不是坏事?谈谈HSBC Overdraft的利与弊 我最近申请了汇丰银行(HSBC)的透支额度(Overdraft),最高限额是5000英镑。我在网上填写完申请表后,系统提示大概需要一到两个工作日才能出结果。后来我收到一条短信,让我打电话联系HSBC。...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  4. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  5. GoPro运动相机可以拿来做什么? GoPro运动相机因其小巧、耐用、防水和高性能的特点,被广泛用于各种极限运动和户外活动的拍摄。它可以用来拍摄滑雪、冲浪、潜水、山地骑行、跑步、攀岩等运动的高清动态影像。此外,GoPro还适合用于日常生活记录,像是旅行、背包客探险、家庭聚会等场景。它强大的稳定性和防水功能让它在水下和恶劣环境下表现出色,甚至可以通过配件安装在头盔、无人机或车载支架上,提供独特的视角。随着最新型号的推出,GoPro还支持4K视频录制和慢动作拍摄,进一步扩展了它的应用场景。 自从新年打折入了GoPro Hero+运动相机以来, 也没怎么用上, 基本上是几天的热性就和其它电子产品一样被冷落到一旁. GoPro运动相机可以拿来做什么, 主要的几个用途是: GoPro 不太适合拍人像 拍孩子孩子容易动, 特别容易就糊了, GoPRO的摄像参数可以调的很少, 所以不要期望有大光圈能背景虚化, 唯一能拍的可能是大长腿, GoPro是广角镜头,...
  6. 小赌怡情 – GPS还是挺靠谱的 小赌怡情 偶尔赌赌没关系 只要不贪婪就好. 不过我赌运真的很差,都没有什么印象自己有赌赢什么过.赌过两次世界杯,结果都是输的比赢的多(还好只输几十镑). 新家和现在暂时住的公寓(公司提供的) 有 10英理左右.开车大概20分钟 每天下班都会和老婆孩子一起搬些东西过去.今天 回来的时候 错过了一个路口 走了另一条路.记得刚开始的时候 GPS是推荐下图中的蓝色这条路的.后来我和我老婆就赌说哪条近,谁也没能说服回,于是答应回家查 GOOGLE 按 谷哥...
  7. 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型 C++ 中的 dynamic_cast 是什么? 用途 在运行时在多态类型之间安全地进行转换 通常用于将基类指针转换为派生类指针(向下转型) 使用 RTTI(运行时类型识别)进行类型检查 基本语法 Derived* d = dynamic_cast<Derived*>(basePtr); 如果...
  8. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...

用 Python 学强化学习: Q-Learning 迷宫示例

[caption id="attachment_70386" align="alignnone" width="2017"]Q Learning强化学习算法(机器学习/人工智能) Q Learning强化学习算法(机器学习/人工智能)[/caption] 强化学习(Reinforcement Learning, RL)是一种让智能体/Agent通过与环境交互、试错学习来获得最优行为策略的机器学习方法。本文用一个简单的 Q-learning 迷宫示例,帮助你快速理解强化学习的基本原理。

强化学习入门:从试错中学习的艺术 Reinforcement Learning 101: The Art of Learning by Trial and Error 深度解析强化学习:Q-Learning算法详解 Deep Dive into Reinforcement Learning: Understanding the Q-Learning Algorithm 机器如何学会自己做决定?强化学习告诉你答案 How Do Machines Learn to Make Their Own Decisions? Reinforcement Learning Explained 从奖励中学习:人工智能的“试错智慧” Learning from Rewards: The Trial-and-Error Intelligence Behind AI

一、什么是强化学习?

强化学习的世界中包含五个关键要素:
  • Agent(智能体):做决策、执行动作的主体
  • Environment(环境):智能体所处的世界
  • State(状态):当前环境的描述
  • Action(动作):智能体可采取的操作
  • Reward(奖励):环境反馈,用来衡量动作的好坏
智能体的目标是学习一个策略 π(a|s),让它在每个状态下选择最优动作,从而获得最大的累积奖励。 [math]J(\pi) = \mathbb{E}\pi \left[ \sum{t=0}^{\infty} \gamma^t r_t \right][/math] 其中 [math]\gamma[/math](0 ≤ [math]\gamma[/math] ≤ 1)是折扣因子,用于衡量未来奖励相对于即时奖励的重要程度。

二、Q-Learning 原理

Q-learning 是最经典的强化学习算法之一。它通过学习一个 Q 表(Q-table)来记录每个“状态-动作”对的价值。 更新公式如下: [math] Q(s,a) \leftarrow Q(s,a) + \alpha [r + \gamma \max_{a'} Q(s', a') - Q(s,a)] [/math] 其中:
  • [math] \alpha [/math]:学习率(Learning Rate)
  • [math] \gamma [/math]:折扣因子(Discount Factor)
  • [math] r [/math]:奖励(Reward)
  • [math] s' [/math]:下一状态(Next State)

三、迷宫环境设计

定义一个 3×5 的迷宫
  • 0:空地
  • -1:墙
  • 1:出口(目标)

四、完整 Python 实现代码


import numpy as np
import random

# 1️⃣ 定义迷宫
maze = np.array([
    [0,  0,  0, -1,  1],
    [0, -1,  0, -1,  0],
    [0,  0,  0,  0,  0]
])

n_rows, n_cols = maze.shape
actions = ['up', 'down', 'left', 'right']
Q = np.zeros((n_rows, n_cols, len(actions)))

# 2️⃣ 超参数
alpha = 0.1
gamma = 0.9
epsilon = 0.1
episodes = 500

# 3️⃣ 辅助函数
def is_valid(state):
    r, c = state
    return 0 <= r < n_rows and 0 <= c < n_cols and maze[r, c] != -1

def next_state(state, action):
    r, c = state
    if action == 'up': r -= 1
    elif action == 'down': r += 1
    elif action == 'left': c -= 1
    elif action == 'right': c += 1
    return (r, c)

def get_reward(state):
    r, c = state
    if maze[r, c] == 1: return 10
    elif maze[r, c] == -1: return -1
    return -0.1

# 4️⃣ 训练循环
for episode in range(episodes):
    state = (2, 0)
    done = False

    while not done:
        if random.uniform(0, 1) < epsilon:
            action_idx = random.randint(0, len(actions)-1)
        else:
            action_idx = np.argmax(Q[state[0], state[1]])

        action = actions[action_idx]
        next_s = next_state(state, action)

        if not is_valid(next_s):
            reward = -1
            next_s = state
        else:
            reward = get_reward(next_s)

        Q[state[0], state[1], action_idx] += alpha * (
            reward + gamma * np.max(Q[next_s[0], next_s[1]]) - Q[state[0], state[1], action_idx]
        )

        state = next_s
        if maze[state[0], state[1]] == 1:
            done = True

print("✅ 训练完成!")

# 5️⃣ 查看学到的路径
state = (2, 0)
path = [state]

while maze[state[0], state[1]] != 1:
    action_idx = np.argmax(Q[state[0], state[1]])
    next_s = next_state(state, actions[action_idx])
    if not is_valid(next_s) or next_s in path:
        break
    state = next_s
    path.append(state)

print("🗺️ 学到的路径:", path)

五、运行结果

运行上面的代码后,你会看到类似输出: ✅ 训练完成! 🗺️ 学到的路径: [(2, 0), (2, 1), (2, 2), (1, 2), (0, 2), (0, 3), (0, 4)] 这说明智能体成功学会了走出迷宫 🎯

六、总结

强化学习使机器能够通过反馈学习最优策略,这类似于人类通过经验学习的方式。 Q-Learning 是许多现代强化学习算法的基础,包括深度 Q 网络(Deep Q-Networks, DQN)。 这个简单的示例展示了完整的强化学习循环:探索 → 反馈 → 改进。
  • Q 表:保存每个状态-动作的价值
  • ε-greedy 策略:平衡探索与利用
  • 奖励函数设计:引导智能体形成目标导向行为
  • 强化学习思想:通过试错和奖励反馈不断改进策略
强化学习的魅力在于,它不需要显式答案,而是让机器自己“摸索”出最优策略。你可以在此基础上继续扩展,比如加入 matplotlib 动画可视化 或使用 神经网络(Deep Q-Learning) 解决更复杂的任务。 英文:How Do Machines Learn to Make Their Own Decisions? Reinforcement Learning Explained

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  4. 给孩子第一台NUC小电脑 Next Unit of Computing Next Unit of Computing (NUC) is a line of small-form-factor computers...
  5. 和媳妇约个会: 剑桥的过桥米线 Dumpling Trees Dumpling Trees 是位于剑桥 Cherry Hilton 附近的一家中式餐厅,以云南特色的过桥米线闻名。店内环境宽敞整洁,菜品丰富,除了经典的米线,还有各类小吃、烧烤和炒饭,味道地道,分量十足。过桥米线的汤底鲜香,配料新鲜,包括鸡肉、鱿鱼、虾等食材,顾客可以自己下锅涮熟,既好吃又有趣。餐厅提供免费停车,但需在店内登记车牌,适合家庭聚餐或周末小聚。 剑桥 Cherry Hilton 那边有一家叫 Dumpling Trees 的过桥米线店,两三年前的冬天我们去吃过一次(剑桥 Dumpling Tree...
  6. 微信PC端程序占用了1.39 TB的空间! 快速清理微信占用空间 前两天我的 C 盘剩余空间突然变红了,我随手一查,竟然发现微信 PC 端程序居然占用了 1.39 TB 的空间,简直不可思议。在手机上,微信同样是名列前茅的“吞空间大户”,在 设置 → 通用 → 手机存储空间 里几乎稳居第一。 更离谱的是,这些空间大多并不是因为聊天记录,而是各种缓存文件、视频、图片和被动接收的文件所堆积起来的。平时我们只是点开看一眼,就算没保存下来,微信也会悄悄把它们留在本地,占据大量磁盘。尤其是群聊里转发的视频和文件,日积月累就成了一个“隐形黑洞”。...
  7. C++的左值/lvalue, 右值/rvalue和右值引用/rvalue references C++ 左值(lvalue)、右值(rvalue)与右值引用(rvalue reference) 理解 C++ 中的左值、右值及其引用形式,是掌握现代 C++(尤其是 C++11 以后的移动语义/move和完美转发/perfect forwarding)必不可少的基础。 📌 什么是左值(lvalue) 左值指的是有名字、可寻址的对象,通常可以出现在赋值语句的左侧。 int x...
  8. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...

C++中检测编译时与运行时: if consteval 与 std::is_constant_evaluated()

C++ 一直在不断增加新特性,以便程序员能够区分在编译时运行的代码和在运行时执行的代码。其中两个重要工具是函数 std::is_constant_evaluated()(C++20)和语言级别的 if consteval(C++23)。本文将解释这两者,展示实际示例,比较它们的保证和权衡,并建议在何时使用各自的方法。 这两种技术都允许你编写分支,根据当前的求值是在常量求值(编译时)上下文中还是运行时上下文中而表现不同。差异虽然细微,但非常重要:一个是返回布尔值的函数,另一个是编译器视为仅在编译时检查的特殊 if 语句,编译器会进行特殊处理。

std::is_constant_evaluated() (C++20)

这是一个在 <type_traits> 中声明的函数:
#include <type_traits>
constexpr bool std::is_constant_evaluated() noexcept;
当当前表达式在常量表达式(编译时)上下文中求值时,该函数返回 true,否则返回 false。 示例:
#include <iostream>
#include <type_traits>

constexpr int f() {
    if (std::is_constant_evaluated()) {
        return 42; // 编译时
    } else {
        return 0; // 运行时 
    }
}

int main() {
constexpr int a = f(); // 编译时求值 -> 42
    int b = f(); // 运行时求值 -> 0
    std::cout << a << ", " << b << "\n"; // 打印 "42, 0"
}

if consteval (C++23)

if consteval 是一个语言级别的 if 条件语句,编译器用它来判断当前求值上下文是否为常量求值。它提供了更强的编译时保证:编译器知道 consteval 分支在常量求值中必须可用,并且会拒绝不能在该上下文中出现的代码。 语法:
if consteval {
    // 仅编译时代码
} else {
    // 仅运行时代码
}
示例:
#include <iostream>

constexpr int f() {
    if consteval {
        return 42; // 编译时版本
    } else {
        return 0; // 运行时版本
    }
}

int main() {
    constexpr int a = f(); // 编译时上下文 -> 返回 42
    int b = f(); // 运行时上下文 -> 返回 0
    std::cout << a << ", " << b << "\n"; // 打印 "42, 0"
}

主要区别(总结)

  • 形式: std::is_constant_evaluated() 是一个函数;if consteval 是一个语言级条件语句。
  • 标准: std::is_constant_evaluated() 出现在 C++20 中;if consteval 出现在 C++23 中。
  • 保证: if consteval 为编译器提供编译时保证,并拒绝编译时无法使用的 consteval 分支中的代码。 std::is_constant_evaluated() 的执行环境更为宽松:它返回布尔值,但不会强制编译器拒绝其他分支中无效的编译时构造。
  • 在表达式内部使用: std::is_constant_evaluated() 可以在语句形式的 if 无法使用的表达式内部使用(例如,在三元运算符内部)。if consteval 需要语句级上下文。

具体比较示例

两个函数看起来相似,但在执行方面表现不同:
// if-consteval 示例
constexpr int f() {
    if consteval {
        return 1; // 仅在编译时
    } else {
        return 2; // 仅限运行时
    }
}

// std::is_constant_evaluated() 示例
#include <type_traits>
constexpr int g() {
    if (std::is_constant_evaluated()) {
        return 1; // 可能仍会编译运行时路径
    } else {
    return 2;
    }
}
以下场景中,差异至关重要:
// 使用 if consteval 时,编译器将拒绝无效的仅限编译时构造
constexpr int bad() {
    if consteval {
        std::cout << "compile-time"; // ❌ 错误 — 常量求值中不允许 I/O
    }
    return 0;
}

// 使用 std::is_constant_evaluated() 时,编译器会更加宽容,可能会编译通过,直到代码
// 实际用于常量表达式上下文。
#include <type_traits>
constexpr int perhaps_bad() {
    if (std::is_constant_evaluated()) {
        std::cout << "compile-time"; // 可能会编译通过;只有在 const-expr 中求值时才会出现错误
    }
    return 0;
}

使用场景

  • 如果您的目标是 C++23(或更高版本),并且想要清晰的、编译时强制的分支:请优先使用 if consteval
  • 如果您必须仅支持 C++20 环境:请使用 std::is_constant_evaluated()
  • 如果您需要在表达式(而非语句)中进行检查,请使用 std::is_constant_evaluated(),因为 if consteval 是语句级的。
  • 如果您希望编译器拒绝编译时无法使用的代码,if consteval 可以提供更强的保证。

实际用例

  • 为编译时和运行时(快速预计算 vs 较慢的运行时)编写不同的实现逻辑)。
  • 保护仅运行时操作(例如 I/O、动态分配或系统调用),以免它们被意外地用于常量求值路径。
  • 在编写可在 constexpr 上下文和正常运行时上下文中使用的库时,提供更清晰、更能揭示意图的代码。

简短实用的检查清单

  • 需要表达式级检查?→ std::is_constant_evaluated()
  • 想要编译器强制执行的仅编译时分支?→ if consteval
  • 仅针对 C++20?→ std::is_constant_evaluated()
  • 针对 C++23+ 并更注重清晰度和安全性? → if consteval.

TL;DR

std::is_constant_evaluated() — C++20:在编译时求值中返回 true 的函数(适用于表达式级检查)。 if consteval — C++23:
  • 编译器将其视为仅编译时分支的语言级条件语句;
  • 更强的编译时执行力和更清晰的意图。

结束语

这两个工具都很有用。如果您可以使用 C++23,则最好使用 if consteval 以获得更清晰的语义和更强的编译时保证,并在与 C++20 兼容或需要表达式级检查时回退到 std::is_constant_evaluated() [show_file file="/var/www/wp-post-common/justyy.com/cpp.php"] 英文:Detecting Compile-time vs Runtime in C++: if consteval vs std::is_constant_evaluated()

相关文章:

  1. 简易教程: C++的智能指针 C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个...
  2. C++中的 const和constexpr 比较 C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr...
  3. 借助AI快速开源了N个小工具: 写代码越来越像做产品了, AI 真把我宠坏了(Vibe Coding) 程序员的未来?Vibe Coding + AI 一起上! 借助 AI 快速开源了三个小工具 最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了几个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行...
  4. 被动收入之: 微博红包 今年开始重新经营我的微博帐号 drlai 收到两笔微信红包,应该是来自于官方的支持,150元(成功提现到支付宝)。虽然这不能持久,也没多少,但毕竟实现了零的突破,意义重大。 如果流量上来,内容创作者可能会接受到比较多的赞赏,这也是一个比较简单的变现方法。这也能作为一种被动收入,不过如果不是头部网红,可能杯水车薪,但如果你有好几个类似这样的,也能积少成多! 在用户中心,微博用户可以每天登陆手机微博APP打卡,获取点数和少量的红包钱(几分钱),积少成多! 微博做些小任务可获得积分和几分钱。聊胜于无。 微博的主要盈利模式 微博的主要盈利模式主要包括以下几个方面: 广告收入:微博的大部分收入来源于广告,尤其是品牌广告和效果广告。广告形式包括信息流广告(类似于推文广告)、热门话题广告、开屏广告和视频广告。品牌和企业可以利用微博庞大的用户群和社交互动来提升曝光率、推广品牌和产品。 会员服务:微博提供的VIP会员服务,用户可以支付订阅费用来享受更多的特权,比如个性化的主题、特有的表情包、私密权限设置等。这些会员服务主要面向个人用户,提升其社交体验。 直播和打赏:微博提供直播平台,用户可以通过购买虚拟礼物来支持主播,微博会从这些打赏中抽取一定比例的分成。此外,微博与内容创作者分成,通过内容付费、知识付费等形式变现。 增值服务:针对企业和大V(拥有大量粉丝的用户),微博还提供增值服务,如账号认证、粉丝数据分析、精准推送、推广和营销工具等。这些服务帮助企业提升营销效果,同时也增加了微博的收入来源。 电商和导流:微博上有大量的电商导流业务,尤其是和明星、网红的合作推广。微博用户在浏览社交内容时,可以直接跳转到商品购买链接,微博通过这种方式赚取导流佣金。 游戏联运:微博也会与一些游戏公司合作推出联合运营的游戏,微博负责推广和流量引入,用户充值或付费时,微博可以获得一部分的分成。 这些模式相结合,使得微博能够在广告市场、内容创作和电商等多个领域获利。...
  5. 豪车的修理费用就是贵一些 去年买了保时捷卡宴SUV(Porsche Cayenne)后,我一直担心将来修车费用会很高。当时购车时,车厂做了一次全面保养,把车里里外外都清洁了一遍。虽然这辆车已经三年车龄,但看上去几乎和新车没区别。 在英国,三年以内的新车通常不需要做MOT年检。而且很多这类新车会通过PCP(个人合同购车)方式出租给车主。简单来说,就是车主每月支付一笔租金,租期通常为三年,期满后可以选择一次性付清尾款买下车辆,也可以继续换租一辆新车。 举个例子,如果一辆新车售价是10万英镑,车厂可能按未来三年折旧后的50%残值来计算每月租金。三年后,如果车主不想买断,车厂就会将车辆作为二手车卖出,回收那5万英镑的残值。这样一来,车厂基本不会亏钱。此外,PCP合同中还有附加条款,比如每年限行1万英里,超出的部分需要额外付费,这些内容都会写在合同里。 车龄到了三年,车辆需要首次做MOT年检,同时车辆的市场价值也会首次出现较大幅度的贬值(一般是50%,甚至更多)。修车厂老板告诉我,相比玛莎拉蒂等其他豪车,保时捷的保值率相对较高。 这一年我开这辆保时捷基本没出什么问题。今年年初做了年检,顺利通过。随后又做了一次常规保养,修车厂老板告诉我,前后刹车片已经磨损了80%–85%。我们住剑桥村里,开车比较多(上班、送娃、家庭旅游都要用车),一年大概能开1-2万英理。 几周后我将车送回去更换刹车片。修完后账单是将近900英镑。我觉得有点贵,车行老板解释说,不仅换了前后刹车片,还有一个前雷达的传感器掉进了车体内部,为了修这个传感器需要拆掉前保险杠等部件,花了6个小时人工费。 我当时质疑说为啥这次修这么贵,他说:“因为这是保时捷。”我说:“那和别的车有什么区别?”他说:“It is not the same.” 我说不都一样么,他说:“It is not...
  6. C++ 教程: 用std::move来移动所有权 📘 C++ 移动语义与 std::move() 教程 C++的std::move用于转移变量/对像的所有权/Ownership。 🔹 什么是移动语义? 在 C++ 中,移动语义通过转移资源所有权/Ownership(如内存或文件句柄)来优化性能,而不是复制它们。 移动语义是在 C++11 中引入的,它允许: 更快速地传递大型或昂贵的对象...
  7. C++ Ranges 教程 C++20 引入了 ranges(范围),这是一个强大且优雅的抽象,用于处理序列(如数组、vector 等)。相比传统的迭代器或旧式循环,Ranges 提高了代码的可读性、可组合性和性能。 什么是 Range? 在 C++20 中,range(范围) 是一种抽象,代表一个可以迭代的元素序列。它与 views(视图) 和 actions(操作) 如过滤、转换等配合使用非常自然。...
  8. 换了个奥迪Q5大灯花了我1000英镑 我那辆奥迪Q5 SUV今年年检没通过,原因是左前车灯坏了,需要更换。车厂告诉我,光是订购零件就要700多英镑,加上人工费,总费用得1000英镑。但没办法,如果不修,车辆年检(MOT)就过不了,车也不能上路。 MOT是英国的机动车强制性安全检测(Ministry of Transport Test)的简称。 近侧前位置灯不工作 drl/位置灯集成(4.2.1(a)(ii)) Nearside Front Position lamp not working drl/position...

废物利用, 找出2TB的WD硬盘外接硬盘盒挂到树莓派当网络硬盘(Raspberry Pi Network Drive)

“用树莓派打造家庭 2TB 网络硬盘” “树莓派 + WD 硬盘:轻松为孩子的 Mac 提供共享存储” “家庭文件共享不再难:自制树莓派网络硬盘” “让树莓派变身 2TB 家庭共享硬盘” “为孩子的 Mac 节省空间:树莓派网络硬盘实战”
前两年,我给两个孩子各买了一台 MacBook Pro。弟弟的那台当时大概六百多买的,SSD 只有 256GB,所以经常硬盘爆满,只能不断删除下载的文件、dmg 安装包之类的。用了一段时间后,MBP 的 ~/Caches 目录也会变得很大,虽然可以临时清理,但这只是治标不治本。 我就跟孩子说,你可以把一些文件放到云盘上,比如 OneDrive、Google Drive,或者我给你接个 USB 硬盘挂到电脑上。OneDrive 有“本地不占空间、数据存到云端”的模式,很省地方,但免费空间只有 5GB。Google Drive 免费空间是 15GB,可用于邮件、照片和 Drive 共享。 孩子不太喜欢用 USB 硬盘,一方面得接电源,另一方面得用 Type-C 转 USB 接口,很麻烦,也不想总插着。 我想到家里有树莓派,可以接一个移动硬盘,通过文件共享,把家里几台电脑都挂接成网络硬盘(Map Network Drive)。于是,我找了几个抽屉,找到一个 2TB 的西部数据(WD)硬盘,3.5 寸的,需要外接硬盘盒,正好前几个月折腾数据时买了一个。 之前挂在HPZ800服务器的D盘。 [caption id="attachment_70022" align="alignnone" width="753"]这个硬盘用了两年多,当时应该是HPZ800服务器的D盘(可以接四个硬盘) 这个硬盘用了两年多,当时应该是HPZ800服务器的D盘(可以接四个硬盘)[/caption]

添加网络硬盘:树莓派通过SAMBA挂接移动硬盘

为了确保硬盘没坏道,我用 CrystalDiskInfo 检查了一下,还让 ChatGPT 帮我看了健康状态——2.3 年通电时间,没有坏道,一切正常。 [caption id="attachment_70028" align="alignnone" width="671"]2TB的西数硬盘还可以再战几年! 2TB的西数硬盘还可以再战几年![/caption]

准备挂接硬盘

第一步,把硬盘接到树莓派上,直接用 USB,但需要额外电源。我找了一个插座,勉强可以在鞋柜里塞下两个插头:一个 3.5 寸硬盘盒和树莓派 4B。 [caption id="attachment_70021" align="alignnone" width="543"]先用df命令看看USB有没有被系统认到。 先用df命令看看USB有没有被系统认到。[/caption] 然后 SSH 登录树莓派,发现硬盘是 NTFS 格式,需要挂载一下:
mkdir /mnt/usb
mount -t ntfs-3g /dev/sdb1 /mnt/usb
其中 /mnt/usb 是挂载目标目录,需要先创建。 如果想开机自动挂载,只需在 /etc/fstab 添加一行:
UUID=<ID> /mnt/usb ntfs-3g defaults,uid=1000,gid=1000,umask=0000,nofail,x-systemd.device-timeout=10 0 0
<ID> 是硬盘的 UUID,可以通过 lsblk -f 查到。

SAMBA网络硬盘

文件共享最简单的方法是安装 Samba:
sudo apt install -y samba
安装完成后,编辑 /etc/samba/smb.conf 添加以下内容:
[usb2share]
   path = /mnt/usb
   browseable = yes
   writable = yes
   guest ok = no
   create mask = 0777
   directory mask = 0777
   valid users = pi
valid users 可以写多个用户,用空格分隔,也可以用 @ 表示群组。用户必须是 Linux 本身存在的账号。 设置 SMB 密码:
sudo smbpasswd -a pi
重启服务:
sudo systemctl restart smbd

添加网络硬盘

在 Windows 上,可以在“此电脑”里右键“添加网络驱动器”,输入地址:
\\192.168.IP地址\usb2share
输入用户名和密码,勾选“记住密码”即可添加网络硬盘,用起来跟本地硬盘差不多。 在 Mac 上,可以在 Finder 按 Command + K 添加服务器,同样输入 树莓派的IP地址、用户名和密码即可。 我给两个孩子和老婆各建了一个目录,让他们把数据放到自己的目录下,2TB 够用一段时间了。 有了这个网络硬盘,分享数据也方便多了(电影、照片等),再也不用通过 WeChat、Whatsapp 或 Google Drive 分享——这些方式要么不方便查找历史文件,要么照片会被压缩。 真好,一下子又让树莓派多了一个用途,不再是积灰的机器了。 [caption id="attachment_70020" align="alignnone" width="864"]目测还有空间,还可以再加一个树莓派/硬盘等。 目测还有空间,还可以再加一个树莓派/硬盘等。[/caption] [caption id="attachment_70027" align="alignnone" width="2048"]把硬盘塞到门口的鞋柜里,电线好乱,还好门一关,媳妇看不见。 把硬盘塞到门口的鞋柜里,电线好乱,还好门一关,媳妇看不见。[/caption] [caption id="attachment_70026" align="alignnone" width="456"]第一次连接需要用户名/密码 第一次连接需要用户名/密码[/caption] [caption id="attachment_70025" align="alignnone" width="1028"]网络硬盘成功的成了本地资源的一部分。 网络硬盘成功的成了本地资源的一部分。[/caption] [caption id="attachment_70024" align="alignnone" width="377"]可以像本地硬盘一下查看属性:使用空间/剩余空间等。 可以像本地硬盘一下查看属性:使用空间/剩余空间等。[/caption] [caption id="attachment_70023" align="alignnone" width="628"]输入IP地址即可访问网络硬盘。选择要挂接的盘符。一般网络硬盘都是从Z往前用。 输入IP地址即可访问网络硬盘。选择要挂接的盘符。一般网络硬盘都是从Z往前用。[/caption] 英文:Found a 2TB Old Hard Drive - Still Young and Healthy [show_file file="/var/www/wp-post-common/justyy.com/raspberrypi.php"]

相关文章:

  1. 倩女幽魂-人间情, 再现经典人鬼CP 这个五一, 由腾讯出品的《倩女幽魂-人间情》 电影上映了(听说耗费巨资, 拍了3年, 1000多个特效镜头, 后期制作近一年). 虽然豆瓣上评分才5分, 但是当我看了预告片还是忍不住看完了. 预告片: 或者 Youtube: https://www.youtube.com/watch?v=iBXEjHG6O0c 总得来说, 可圈可点, 因为87版王祖贤张国容的那版堪称经典,...
  2. 最后一天在谢大工作 2013年10月,我开始在谢大,也就是 University of Sheffield 工作. 这是个两年的合同, 是在一个欧盟项目下,公司暂时把我借调给大学.我的工作标题 是 Marie Curie Experienced Researcher 简单来说也就是研究员,也就是相当于国内说的 博士后(不是学位,只是份工作). 两年,...
  3. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  4. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  5. Linux 下的 figlet 命令 Linux 下有一个好玩的命令: figlet 这个命令是把一些信息用大的”字体”打印出来. 比如, 你可以通过管道将最后的结果用 figlet 显示出来.可以通过 apt-get install figlet(Ubuntu) 或者 sudo yum install...
  6. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  7. 最好的给CPU降温方法就是通过改BIOS里的CPU风扇速度 家里的HPZ800服务器啥都好, 就是太吵. 之前显卡温度过高(可能是积灰的缘故)拿着电风扇对着机箱吹, 就更吵了. 最近我发现CPU温度也偏高, 因为一旦跑一些程序, CPU利用率上来了, CPU自动调节风扇就特别响, 像飞机起飞的. 而且温度也很容易升到80多度. 我查了一下, 因特志强X5650系列最高工作温度(健康温度)是81点3度. 想着不能就这样放任它不管, 于是想到了一招: 重启F10进BIOS设置,...
  8. 时隔两年, 重新教媳妇编程, 不过她好像全忘光了 我上一次教我媳妇编程,大概是两年多前了。后来因为工作太忙,再加上一些其它原因,就停下来了。其实她对编程也不是很感兴趣,反倒更喜欢用 Excel,因为她工作中经常会用到。 上周刚好有点空闲时间,我又教她写了一个反转链表的题目。这个题我前阵子刚教过我儿子,觉得既适合用来面试,也很适合用作编程启蒙。 不过整个过程下来,她一直显得很迷茫。我也不确定是不是我讲得不好。还记得以前有网友留言调侃:“课讲得很一般,不过媳妇还挺好看的。” 说到底,编程不能只停留在理论层面。如果只是单方面学习、平时又缺乏实践的话,不仅学得不深入,而且很容易就忘了。学编程最好的方法就是敲代码。 我挺喜欢“输出型”的事情,像教娃、教媳妇这种,既能复盘知识,又特别解压。之前有网友留言:“你能教媳妇编程还不被她一顿骂,已经很成功了,这可是站在作死边缘反复横跳啊。” 网友说:“难度太大了 赖总 可以换换思路 教教好玩的 比如说图形化编程 或者ai做游戏 或者ai做视频 音乐啥的 女生喜欢这些...
❌