0.033秒的艺术 --- Know How System.Math Works

2024-01-19 00:18
文章标签 math system 艺术 know works 0.033

本文主要是介绍0.033秒的艺术 --- Know How System.Math Works,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0.033秒的艺术 --- Know How System.Math Works

仅供个人学习使用,请勿转载,勿用于任何商业用途。 

 

     在对.net程序进行调试或者性能测试时,常常需要查看生成的IL代码,但仅仅有IL代码还是不够的,有时我们还希望查看CLR生成的最终asm代码。在VS里,可以非常方便的查看最终的asm代码:当程序执行到断点时,在代码窗口右键选择Go To Disassemble就可以。但是,当通过VS Debug程序时,为了方便调试,CLR通常不会生成最优化的代码。所以为了得到实际运行时的asm代码,还必须做以下设置:

1,在Release模式下编译代码;
2. 打开工程属性窗口,选择”Build”页面--- “Advanced”,弹出窗口的“Debug Info”项设置为”pdb-only”。
3. 打开Tools => Options => Debugging => General,保证Suppress JIT optimization on module load和Enable Just My Code处于未选中状态。
    可以在这里找到关于配置的更多资料。

     
我对.net 数学库做了一系列测试,结果可谓喜忧参半。当然,不同机器上可能得到不同的asm代码,以下是我的测试配置:intel Q6600 + .net framework 3.5 sp1。下面就来看看System.Math下个函数的性能。测试代码如下:

array[i] = Math.XXX(array[i]);


1. Math.Sqrt, Math.Sin, Math.Cos是所能期望的最理想实现,三个函数分别直接映射为fsqrt, fsin和fcos三条浮点汇编指令,可以认为这3个函数与汇编代码的效率一样。


2. Math.Asin, Math.Acos, Math.Tan, Math.Atan, Math.floor, Math.Cell, Math.Log,Math.Exp,Math.Floor,Math.Pow,Math.Round以及其他所有以h结尾的三角函数:非常不幸,即使是在Disassemble下,也无法看到这些函数的实现(或者说我不知道怎么看-_-)。唯一可以知道的是算法并没有inline。查看这几个函数的IL代码,可以发现它们都被标记为” cil managed internalcall”。MS所有文档中对这个标记的解释都非常少。因此只能假设MS对于这几个函数的调用做了特别优化。


3. Math.Abs. 这个函数比较特别,参数类型不同,所生成的代码也不同。对于浮点数来说,将会直接映射为浮点汇编指令fabs。对于int,却出乎意料的复杂。代码会想检查参数是否为负数,如果是,则需要进一步调用函数System.Math.AbsHelper,这是Math类的一个私有方法,它会进一步检查数据是否会溢出。如果不考虑安全性,自己编写一个简单的整数绝对值表达式要高效很多:

4. Math.Max, Math.Min则是用最普通托管语言编写的代码,没有特别优化,但这2个方法是inline的。

 


 ps: csdn的blog太烂,想搬家了:(

 

这篇关于0.033秒的艺术 --- Know How System.Math Works的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620717

相关文章

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

System.getProperties().

Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言: 一、说话的真实程度分级 二、说谎动机分级:善意谎言、中性谎言、恶意谎言 三、小心:所谓真相:只说对自己有利的真相 四、小心:所谓真相:就是别人想让你知道的真相 五、小心:所谓善解人意:就是别人只说你想要听到的话 前言: 何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相! 人与人交流话语中,处处充满了不真实,完全真实的只是其中一小部分,这