惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
H
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
L
LINUX DO - 最新话题
A
Arctic Wolf
博客园_首页
S
Securelist
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
Cyberwarzone
Cyberwarzone
小众软件
小众软件
T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
博客园 - 聂微东
F
Fortinet All Blogs
Simon Willison's Weblog
Simon Willison's Weblog
H
Heimdal Security Blog
罗磊的独立博客
S
Security @ Cisco Blogs
B
Blog
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
Intezer
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
S
Schneier on Security
月光博客
月光博客
L
LINUX DO - 热门话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

C++

小孩马上高一,但是想学信奥赛 c++,有什么学 c++的书推荐? - V2EX 真是意想不到的操作:有好几个人一起协作向 C++库 fmtlib 加上了 C11 包装接口,确实能用 - V2EX 基于 C++20 协程编写 gRPC 客户端与服务端 似乎在 C 的领域,让一个新程序“为未来准备好”是一件很麻烦的事 - V2EX 请教各位 centos 7.9 通过 devtoolset 启用 c++14/17 时遇到的链接问题 - V2EX 求大佬指点:Windows 上 c++部署最新 Paddleocr,无法通过内存识字 - V2EX 为 c++ 提供模式匹配 - V2EX 分享一下我个人开源的 C++23 协程网络框架 - V2EX 为什么写 C++的人年龄偏大? - V2EX 大型 c++项目,在 ai 帮助下完成 Linux 平台移植,可行性多大? - V2EX 少用 auto - V2EX 再一次感觉到 C++的恶心 - V2EX 分布式存储 - V2EX [求助] Linux 有什么好的引入 c++ 第三方库的方案 - V2EX [求助]请教一个 C++多线程的性能问题 - V2EX 2026 年找 C++的开发工作,应该学习 C++的哪个版本? - V2EX 分布式系统 - V2EX 使用匿名结构体指针作为常量来杜绝魔数,是否合理/值得? - V2EX 有没有什么工具可以统计 C++项目里标识符的使用情况? - V2EX 看到一些 C++ 或者 C#项目 驼峰和下划线一块用,为啥泥? - V2EX [求助] Linux 系统下动态库卸载后全局变量未重置的问题 - V2EX 交叉编译 asop android adb 最新版的问题 - V2EX [有偿] 小白, Windows UI Automation TextPattern 检测问题求助 - V2EX 小白问个 vcpkg 相关的问题 - V2EX 记录一次踩坑过程(clion + cmake + vcpkg) - V2EX 用智能指针管理 ffmpeg 中的数据结构是有必要的吗? - V2EX 定位重载的插件或者 IDE - V2EX 想系统的学习 Modern C++,麻烦大佬们推荐一些书籍 - V2EX 困扰几天的问题,这是被 gcc 优化了吗? - V2EX 好的 c++代码是什么样的 - V2EX 为什么 C/C++ 语言的标准库不做成 Java 那样可安装的运行时? - V2EX CLion 提供非商业免费使用了 - V2EX MFC c++对话框项目使用 httplib 创建静态资源服务, Debug 时每次访问都会被断下是什么原因 - V2EX c++调试遇到奇怪问题 - V2EX 求推荐 C++ 高性能的 web 框架, curd 用 - V2EX 一个项目下有多个 cpp 程序的源文件以及多个程序共用的源文件与头文件, vscode 的 clangd 插件与 compile_commands.json 该如何配置 - V2EX C++库脚手架项目及思考 - V2EX 有人遇到过 vs2022 c++代码高亮不生效的问题吗? - V2EX 使用 C++20 协程与 ASIO 库写了个 Socks5 Server 的跨平台 Demo 程序,几乎全功能,单文件源码少于一千行 - V2EX 小众论坛问个好奇的问题关于 c++ - V2EX 市面上大部分 c++程序员都在 c++98 水平吧? - V2EX cpp 一个隐式转换奇怪的现象 - V2EX C++入门书籍,我是不是被坑了? - V2EX mac clion 调试怎么才能看到 stl 容器的值 - V2EX 有没有合适开源的 C++项目可以快速实现一些功能 - V2EX 用 c++实现 bluez 对于 31 个字节蓝牙广播限制的问题 - V2EX 寻找一个在线运行 c++的方案 - V2EX 这种情况如何消除几百个 if/else - V2EX cmake + googletest 的目录结构最佳实践是? - V2EX Asio 异步模型 - V2EX 求教, mac 下 cmake c++工程编译后 elf 里面还有很多路径字符串 - V2EX C 怎么进阶学 C++呀
为什么打印模板元编程计算阶乘结果,比打印 for 循环计算阶乘结果更耗时 - V2EX
zcion · 2024-12-09 · via C++

最近看了 effective c++ 这本书,书中有一种用模板元编程计算阶乘的骚操作,说是可以将计算从运行时转到编译期间,这样可以提高代码的执行效率。

但我尝试了下,发现并没有比使用 for 循环计算阶乘的方法快,反而花费了更多的时间,代码如下:

#include <chrono>
#include <cstdlib>
#include <iostream>
#include <new>
#include <vector>

using std::size_t;

template <unsigned x>
struct fac {
    static const size_t value = x * fac<x - 1>::value;
};

template <>
struct fac<1> {
    static const size_t value = 1;
};

// for 循环计算阶乘
size_t fori(size_t v) {
    size_t tmp = 1;
    for (size_t i = 1; i <= v; i++) {
        tmp = tmp * i;
    }
    return tmp;
}

// 利用模板元编程计算阶乘
constexpr size_t facc() { return fac<901>::value; }

void func() {
    // 模板元编程计算耗时
    auto start = std::chrono::high_resolution_clock::now();

    constexpr auto tmp = facc();
    std::cout << tmp << std::endl;

    auto end = std::chrono::high_resolution_clock::now();
    auto duration =
        std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);
    std::cout << "Elapsed time: " << duration.count() << " ns"
              << std::endl;  // 输出 57466 ns

    // for 循环计算耗时
    auto start1 = std::chrono::high_resolution_clock::now();

    size_t t = fori(901);
    std::cout << tmp << std::endl;

    auto end1 = std::chrono::high_resolution_clock::now();
    auto duration1 =
        std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - start1);
    std::cout << "Elapsed time: " << duration1.count() << " ns"
              << std::endl;  // 输出 1647 ns
}

int main() { func(); }

如果去掉打印,反而是利用模板元编程的更快,确实符合编译期计算提高效率的说法,但这里打印了其结果,反而花费了更多时间。

这是为什么,是编译器自个的优化策略问题还是什么?

编译器版本:gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0