首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用-O3编译gcc从技术上提高了我的缓存未命中率

使用-O3编译选项可以在技术上提高缓存未命中率。-O3是GCC编译器的一个优化选项,它会对代码进行更深层次的优化,以提高程序的执行效率和性能。

缓存未命中率是指在程序执行过程中,CPU需要从主存中获取数据或指令的次数与CPU从缓存中获取数据或指令的次数之比。缓存未命中率越低,表示程序能够更充分地利用CPU缓存,从而提高程序的执行效率。

使用-O3编译选项可以通过以下几种方式提高缓存未命中率:

  1. 代码重排:编译器会对代码进行重新排列,以使得程序的局部性更好。局部性是指程序在执行过程中,很可能会访问附近的内存地址。通过优化代码的排列顺序,可以提高程序的局部性,减少缓存未命中率。
  2. 循环展开:编译器会将循环展开成多个重复的代码块,以减少循环的迭代次数。这样可以提高指令级并行性,减少分支预测错误,从而降低缓存未命中率。
  3. 数据对齐:编译器会对数据进行对齐,以使得数据在内存中的存储位置与CPU缓存的行对齐。这样可以提高数据的访问效率,减少缓存未命中率。
  4. 内联函数:编译器会将函数调用处直接替换为函数体,以减少函数调用的开销。这样可以减少指令的跳转和保存现场的操作,提高指令级并行性,从而降低缓存未命中率。

使用-O3编译选项需要注意以下几点:

  1. 可能会增加编译时间:由于-O3会进行更深层次的优化,因此编译时间可能会增加。
  2. 可能会增加代码大小:优化后的代码可能会比原始代码更大,因为优化后的代码可能包含了更多的指令。
  3. 可能会影响调试:优化后的代码可能与源代码的行号不一致,这可能会对调试造成一定的困扰。

总结起来,使用-O3编译选项可以在技术上提高缓存未命中率,从而提高程序的执行效率和性能。然而,使用该选项需要权衡编译时间、代码大小和调试的影响。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

总结ACM竞赛中常见影响运行速度几点

#pragma GCC optimize(3) 不过一般OJ都是默认开启,洛谷需要手动点一下。只要记住一直带着O3优化就可以了。 原理的话可以举个例子。 比如这段代码。...不开优化汇编是这样 而我们只需要加上O3优化 汇编就变成了这样 编译器在编译时候就帮你算出了一些值。...还有一些特殊情况,据说由于开了O3后生成汇编指令太多导致速度变慢,但是没有遇到过。大部分比赛都是开O2优化。...,洛谷上线段树模板题尝试过,快不了多少其实。...不过结构体写可以代码补全(确信 存图方式 测试了一下vector和链式前向星速度。 vector跑了0.0488s ,链式前向星跑了 0.0224s ,明显是链式快一些。

1.4K30

熟悉又陌生arm 编译器详解(armccarmclang)

苹果公司之前一直使用GCC作为编译器,但是GCC对Objective-C支持一直不怎么好,好多新特性没有增加,所以苹果公司开始寻求编译替代品。...后来苹果公司直接计划绕开GCC,于是招募了Chris Lattner 博士开发编译器,Clang就这样诞生了,其基于LLVM开发C/C++/Obj-C编译器,实际上其是一个编译器前端,来取代GCC或者超越...虽然 -O0 生成调试视图与源代码最接近,但用户可能更喜欢 -O1 生成调试视图,因为这提高了代码质量在不改变基本结构情况下。...编译器只执行可以描述为调试信息优化。删除使用内联函数和使用静态函数。关掉严重降低调试视图优化。如果与 –debug 一起使用,此选项会给出总体上令人满意调试视图且具有良好代码密度。...如涉及作品版权问题,请联系进行删除。 ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

1.8K40

valgrind使用介绍

它可以帮助您使程序,尤其是C和C ++编写程序更加正确。 Cachegrind是一个缓存和分支预测探查器。它可以帮助您使程序运行更快。 Callgrind是一个生成调用图缓存分析器。...三、 编译程序 使用编译命令生成可执行程序 gcc -Wall main.c -g -o test -Wall 表示生成警告信息 main.c 代表要编译源文件...-g 生成调试信息 -o file 生成可执行文件 -O0 、-O1 、-O2 、-O3 编译优化选项 4 个级别,-O0 表示没有优化...注意: (1)打开调试模式(gcc编译-g选项)。如果没有调试信息,即使最好valgrind工具也将只能够猜测特定代码是属于哪一个函数。...这些优化选项可能会使得memcheck提交错误初始化报告,因此,为了使得valgrind报告更精确,在编译时候最好不要使用优化选项。

3K30

协程框架(libcopp)v2优化、自适应栈池和同类库Benchmark对比

在第一次访问映射地址时候(特别是协程第一次切入到执行栈),会触发一次缺页中断,然后由操作系统把实际物理页映射上去,然后再继续执行。这个缺页中断引起开销是其他协程创建流程总和大约10倍左右。...性能对比 从压测结果上看,v2版本对v1CPU L1缓存命中率是有下降。我们分析这是因为v1版本中对象是碎片化关系。...,后一个对象还是有部分数据被加载到了缓存中,小对象缓存命中率还是比较高。...同时我们大部分项目上线时候编译选项都是-O2,所以在压力测试时候我们也尽量使用O2级别的编译优化(有些系统自带包会用O3),编译选项是 -O2 -g -DNDEBUG -ggdb -Wall -...goroutine切换并没有优势,但是创建性能还是挺高,原因之一是对go不是很熟,不太清楚怎么让gocachemiss掉,看起来它自带一些池子功能。

82930

协程框架(libcopp)v2优化、自适应栈池和同类库Benchmark对比

在第一次访问映射地址时候(特别是协程第一次切入到执行栈),会触发一次缺页中断,然后由操作系统把实际物理页映射上去,然后再继续执行。这个缺页中断引起开销是其他协程创建流程总和大约10倍左右。...性能对比 从压测结果上看,v2版本对v1CPU L1缓存命中率是有下降。我们分析这是因为v1版本中对象是碎片化关系。...,后一个对象还是有部分数据被加载到了缓存中,小对象缓存命中率还是比较高。...同时我们大部分项目上线时候编译选项都是-O2,所以在压力测试时候我们也尽量使用O2级别的编译优化(有些系统自带包会用O3),编译选项是 -O2 -g -DNDEBUG -ggdb -Wall -Werror...goroutine切换并没有优势,但是创建性能还是挺高,原因之一是对go不是很熟,不太清楚怎么让gocachemiss掉,看起来它自带一些池子功能。

59910

【玩转Lighthouse】网络性能调优 -- 工具篇

但是,当我们利用'-O'以上优化选项编译程序时,GCC会将栈底指针优化掉,并把EBP作为一个通用寄存器。此时,我们从EBP中读到值就不再是栈底指针了。...它是在内部使用性能监视单元,也就是PMU(Performance Monitoring Units)硬件,来收集各种相关CPU硬件事件数据(例如缓存访问和缓存命中),并且不会给系统带来太大开销。...** 这样做道理很简单,对一个系统而言,所有的缓存大小,包括最后一级缓存LLC,都是固定。如果每个数据变小,各级缓存自然就可以缓存更多条数据,也就可以提高缓存命中率。这个方案很容易理解。...**第二个方案,是软件方式来预取数据。** 这个方案也就是通过合理预测,把以后可能要读取数据提前取出,放到缓存里面,这样就可以减少缓存命中率。...“软件方式来预取数据”理论上也算是一种“空间来换时间”策略(参见第20讲),因为付出代价是占用了缓存空间。当然,这个预测结果可能会不正确。

88740

C和C++编译工具基本使用方法

GCC下面有两个比较常用工具就是gcc(GUN C Compiler)和g++(GUN C++ Compiler),即c语言编译器和c++编译器。通常用gcc编译c代码,g++编译c++代码。...实际上可以直接g++编译c或者c++代码。本次我们介绍怎样使用g++。 写C/C++代码工具建议使用 Sublime Text 或者 VSCode,自己更喜欢 Sublime Text。...-o test (2)优化源代码 所谓优化,例如省略代码中从来使用过变量、直接常量表达式结果替代等,这些操作会缩减目标文件所含代码,提高最终生成执行文件运行效率。...如 -O2,-O3,-On(n通常为3) -O 同时减少代码长度和执行时间,其效果等价于 -O1 -O0 表示不做优化 -O1 表示默认优化 -O2 除了完成-O1优化之外,还进行一些额外调整工作...,如指令调整等 -O3 则包括循环展开和其他一些与处理性相关优化工作,选项将使编译速度比 -O 慢,但通常产生代码执行速度会更快。

1.2K10

浅谈Linux环境下gcc优化级别

,也就是gcc – o系列,下面将简述一下各级优化过程以及实现。...gcc – o1 首先o1上面还有一个o0,那个是不提供任何优化,项目中几乎不会使用,而o1使用就非常广泛了,o1是最基本优化,主要对代码分支,表达式,常量来进行优化,编译器会在较短时间下将代码变得更加短小...gcc – o2 这个优化级别是o1进阶,在上一级基础上会进行更严格细分,最重要是加入了寄存器使用。...gcco3 这个优化属于非常强大优化,因为编译器会进行预测,对循环每一层预测,以便于将循环拆分,可以提高执行效率。...编译器还会试图已有的值来代替未知值,并且还会用加代替乘,因为运算器特性,乘法十分复杂耗时。当然o3缺点最明显,那就是o3因为试图预测程序走向,可能会出现误差,导致错误和程序不可逆转走向。

1.8K20

全志科技A40i国产开发板——性能参数综合测试

-o3)" */#endif如果-O0编译则改为”-O0”typedef ee_u32 ee_ptr_int;改为typedef unsigned long ee_ptr_int;编译export PATH...=$PATH:~/lichee/out/sun8iw11p1/linux/common/buildroot/host/usr/binarm-linux-gnueabihf-gcc -O3 -DSTREAM_ARRAY_SIZE...records in65536+0 records outreal 0m10.386suser 0m0.070ssys 0m4.040sroot@T3/A40i-Tronlong:/#以上仅作参考,实际欸有考虑缓存影响...总结以上综合对性能进行了测试,感觉性能还是非常不错,各测试结果仅作参考,因为环境等因素不一样测得结果也会不一样,包括存储测试方法也不是很科学,比如没有考虑缓存等。...上述测试只是一个定性性能体验,板子性能是一个综合体验,需要是面对真实应用场景才有意义,并且针对场景优化也很重要。

93950

宋宝华: 关于Linux编译优化几个必须掌握姿势

01 编译选项和内核编译 首先我们都知道,Linux内核如果O0编译,是无法编译,Linux内核编译,要么是O2,要么是Os,这点从LinuxMakefile里面可以看出: ?...O2里面optimize-strlen是开,Os里面这个选项是关闭。相关选项含义可以通过"man gcc"看出(有问题,找男人),譬如man gcc后检索inline-functions: ?...从O0到O1,O2,O3,是一个开启优化选项逐步加大过程: ? kernelO0编译不过,是因为kernel本身也没有想用O0能够编译过,它设计里面包含了编译会优化假想。...下面我们一个简单例子来说明。 02 一个简单例子 下面的代码: ?...4.不想被优化 在全局已经使能O1, O2, O3, Os情况下,某个单独函数我们不想做任何优化,可以__attribute__((optimize("O0")))来修饰这个函数,比如我们把上述

3K20

c语言内嵌汇编代码之Clobbers用途到底是什么

通俗来讲,Clobbers 用途就是为了告诉编译器,这里指定这些寄存器在该asm语句汇编代码中用了,你在编译这条asm语句时,如果需要用到寄存器,别用这里指定这些,否则就都乱了。 5....先看inc1方法: $ gcc -O3 main.c && objdump --disassemble=inc1 a.out 0000000000001190 : 1190: 89...但是,我们既然已经在汇编代码里用到了eax寄存器,为什么gcc还会分配eax给其他汇编代码呢?...这是因为,gcc编译时,根本就不会分析asm里汇编代码,所以它也就不知道我们已经使用了eax寄存器,所以才导致最终冲突。 那我们怎样才能告诉gcc,我们已经用了eax寄存器,让它别再用了呢?...看下inc3汇编代码再确认下: $ gcc -O3 main.c && objdump --disassemble=inc3 a.out 00000000000011b0 : 11b0

2.8K30

云原生场景下如何实现编译加速?

BASE 执行 无缓存 平均时间:5.26min 有缓存 平均时间:41.462s 提升效率 提升 87.3% 缓存命中率 接近 100% 2 NodeJs 在 nodejs 编译中,我们缓存目录是当前用户空间...使用举例 BASE 执行 无缓存 平均时间:58s 有缓存 平均时间:29s 提升效率 提升 50% 缓存命中率 接近 100% 3 Golang 编译 Golang 缓存路径通过 $GOCACHE...BASE 执行 无缓存 平均时间:117s 有缓存 平均时间:18s 提升效率 提升 84.6% 缓存命中率 接近 100% 4 GCC 编译 我们使用 ccache 进行缓存实现。...总结 在不同语言编译原子内部,默认开启缓存设置。第一次运行流水线时候,会进行依赖下载,第二次运行流水线,会命中缓存,无需进行依赖下载,提高了流水线执行效率。缓存默认保存 7 天。...编译中有包含单元测试) 缓存命中率 接近 100% 未来规划 ・不同编译原子,向用户开放配置,如是否开启缓存,设置缓存 key ・实现不同语言编译原子增量 push 缓存功能 ------ 我们创建了一个高质量技术交流群

47410

【gccg++】程序翻译(.c -->.exe)

本次章节将在linux下编译gcc进行一步步讲解。通过本次章节学习,将会掌握linux中编译gcc/g++用法,以及源文件到可执行程序形成相关知识。...gcc -E:从现在开始,进行程序翻译,直到预处理完成后停止 -o:后面紧跟自己想要生成指定目标文件(即给默认生成文件重命名,便于观察) 编译gcc -S) 第二个阶段为程序编译,该阶段主要是将...C语言转化为汇编语言,我们可以使用gcc -S 指令来生成编译阶段产生目标文件,该阶段生成目标文件后缀为.s gcc -S:从现在开始进行程序翻译,到编译阶段完成后停止 汇编(gcc -c) 第三阶段为汇编阶段...(gcc不加选项,直接gcc 源文件 -o 目标文件 会直接形成最终可执行程序,一般使用gcc编译c语言,g++编译c++语言,用法相通) 扩展选项(gcc/g++) -E 只激活预处理,这个不生成文件...-O0 -O1 -O2 -O3 编译优化选项4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 -w 不生成任何警告信息。 -Wall 生成所有警告信息。

69880

GCC编译器基本使用方法

GCC是可以直接完成源文件编译。经常使用命令就是直接生成一个可执行文件。 gcc 源文件 -o 可执行文件 这样方式,可以把源文件直接编译为可执行文件,并且为可执行文件指定名称。...预处理阶段展开宏,文件包含,条件编译。在正常情形下,GCC不会保留预处理阶段文件,但是使用-E选项可以保留。例如 ? 编译是对上面的.i文件进行编译完成以后生成汇编文件。...在链接过程中,它必须把符号(变量名、函数名等一些列标识符)对应数据内存地址(变量地址、函数地址等)替代,以完成程序中多个模块外部引用。最终生成可执行文件。...幸运是,虽然GCC没有自动项目管理工具,但是它提供了Makefile文件来帮助我们提高写程序效率。 GCC可以使用-O0,-O1,-O2,-O3可以优化程序。...O0表示不优化,O3表示优化等级最高。 GCC使用-Wall来打印警告信息,这样有助于调试程序。 GCC使用-w来忽略所有的警告。 GCC使用-g包含调试信息,这在使用gdb调试时候是必要

1.7K20

开发工具选对---性能提升万倍也有机会

最近有计划写一个程序对数据库做一个压测,这里涉及到大量数据生成工作,于是想着测下一下不同语言 for 执行情况。 首先强调一下,这个不是对比语言,就是一个个人对比测试。...-O3 : gcc -O3 -ocfor cfor.c #include int main(){ unsigned long sum = 0; unsigned...在这个测试中发现一个怪异问题,c, rust多次执行时间都是0.004s,估计是有缓存了,在测试意义不大了。...这几个测试走下来,对这个不怎么写程序的人感觉对于理解编译优化, 数据溢出都挺有帮助。 数据库中跑这个需求效果怎么样? 从事数据库习惯,想到这个需求 SQL 也比较简单,适合在数据库里跑。...BTW: 觉得写数据库压测程序应该尝试用 Rust 实现一下。已经参加一个月 Rust 公开课了,也需要尝试一下了。

28820

cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

项目中有一个so动态库,需要在java中通过jni调用,因为涉及频繁内存分配操作所以这个so希望tcmalloc管理内存池以提高系统运行效率,如果使用以动态库方式使用tcmalloc。...使用这种方案,so库代码不需要在编译时链接tcmalloc,什么都不用改变,就能使用tcmalloc。...于是觉得用静态链接方式将tcmalloc编译到so库中比较好,这样这个动态库以比较独立方式发行,不再依赖系统中是否安装了tcmalloc和libunwind。...-shared》),解决这个问题方法也大同小异,就是根据这个错误提示-fPIC参数重新编译相关库,这里是就是指要重新编译tcmalloc。...总结 如果在可执行程序中静态链接tcmalloc时,默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是在动态库(so)中静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc

1.9K10
领券