arm64汇编篇-13编译器优化及寄存器与多线程问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asuno_1/article/details/80650197

编译器模式

 Debug Release不同模式下编译器的配置不同的,buildSettings -> 搜索optimization 如下图:
编译器优化选项

以下几个模式是将编译器优化的几个方向。

编译器优化效果

1.将Debug选项的none 选择为跟Release 模式下的Fastest Smallest
2.去掉main函数的循环写入以下代码:

    int a = 1;
    int b = 2;
    return 0;

3.运行结果
未优化的main函数

优化编译器
4.解析
 由上图可以看出,main函数由原来很长的开辟栈空间存取a、b数值等操作简化成一个return 0 的操作。
注:优化后的编译器是将所有没有用到的代码都去掉了

编译器对函数的优化

1.写函数方法:

int func (int a,int b)
{
    return a + b;
}

2.运行None模式和fastest Smallest模式效果如下:
None模式运算

fastest 模式运算

3.解析:
可以看出在None模式下汇编语言是进行正常的流程操作。
而在fastest模式下,函数int c的值并没有进行函数的运算而是直接赋值,**###因为函数在编译的时其算法就被编译器知道所以这边没有进行计算而是直接给出编译器结果###**

总结:

1.我们在Debug模式下,编译器的运行效率和包的大小是不如Release模式的。
2.编译器优化将不会运行无效代码以确保汇编的代码量,同时已知函数的算法在运行函数的时候可能直接给出结果而不去进行运算。
3.当然针对函数的编译优化,函数是静态的,oc是动态的编译的时候不知道方法是需要在内存中找,所有编译器优化在函数级别。
4.执行指令越多越耗时。
5.速度 寄存器>高速缓存>内存>磁盘。
6.代码的读取方式 程序启动 -> 磁盘读取到内存 -> 内存一部分放到高速缓存 ->pc访问高速缓存

多线程与寄存器

  • 线程的切换由操作系统去操作的(以前学的时候可能说是cpu)。
  • 操作系统在切换线程的时候会进行寄存器的保护。
  • 所有防止资源抢夺的都是对内存的操作,寄存器由系统负责不需要考虑。
展开阅读全文

没有更多推荐了,返回首页