前言

ACM 时,曾经测试过 Lutece 的速度并记录在这篇博客,毕竟 OJ 运算速度直接关系到了每一次写的代码的复杂度。

脱坑 ACM 以后,在编程珠玑里面看到了自己的电脑的运算速度应该作为常识记住,于是就花一天的时间测了一下,并进行了简要分析。附测试的代码和完整数据。

本文涉及到的次数并不准确,因为没有计算 for 循环递增量以及执行 for 循环的时间。本文只是粗略统计一下电脑计算速度的数量级,以及比较各状态下的速度。

测试环境测试电脑:Surface Book

CPU:Intel(R) Core(TM) i7-6600U CPU @ 2.60GHz

测试线程数:1

操作系统:Windows 10 10.0.18912.1001 (64 bit)

编译器:MSVC 2017

编译选项(除测试架构和编译选项时):X64, Release, O2 优化

每次测试组数:20(程序启动的前两组速度有明显的差异,因此统计运算速度时之计后 18 组)

结论对于架构和编译选项来说,O2 优化能带给程序 3-9 倍的速度提升;同样的代码编译出的 64 位程序较 32 位快 13% - 218%;

整型的运算的加、乘都是 1e9 次/秒数量级的,浮点类型的加、乘都是 1e8 次/秒数量级。对于 log 和 sqrt 类型,整型可能会慢于浮点类型,但都在 1e7次/秒 数量级;

极端数据范围的数据运算不影响整型运算的速度,略微影响浮点型运算的速度(10%);

高精度运算在 long long 范围内加,比 C 自带整型类型慢三个数量级;100 位的加法也只比前面慢不到一个数量级(后经测试,乘法慢于加法,但差别不大,虽然是乘法 $O(n^2)$,但 n=100 也较小)。

测试一:架构和编译选项

测试的是 long long 类型从 1 加到 1e9。以下是测试结果:

1s 运算次数

debug(Od)

release(Od)

release(O1)

release(O2)

x86

3.05E+08

\

\

9.55E+08

x64

3.47E+08

3.61E+08

1.9E+09

3.04E+09

注:Od 为禁用优化,O1 为最大优化(优选大小),O2 为最大优化(优选速度)。

可以观察到,在没有优化的情况下,debug 和 release 的区别其实不大。但是开了 O2 优化以后,程序获得了 3-9 倍的加速。

而对于 x86 和 x64 来说,无优化下,x64 略快于 x86 (约 13%);而在 O2 优化下,x64 较 x86 快了 218%。

测试二:数据类型和运算

测试的类型有 int,long long,float,double 和一个自定义的高精度运算 BigInteger(源码包含在测试代码中)。测试的运算有 +,*,cmath 中的 sqrt() 和 log()。

int,long long,double 都是从 1 测到 1e9。

在进行 float 的测试时发现使用 i++,当数据达到 $2^{24} \approx 1.6 \times 10^7$ 时,i 的值不会发生变化(1 溢出了,这和和浮点数的记法有关)。于是对于 float 的测试都是从 1 测到 1e7,重复 100 次。

BigInteger 由于太慢,只从 1 测到 1e7。

以下是测试结果:

1s 运算次数

int

long long

float

double

BigInteger

+

3.26E+09

3.04E+09

5.92E+08

5.20E+08

1.51E+06

*

1.99E+09

2.00E+09

6.36E+08

6.43E+08

1.11E+06

log()

3.70E+07

4.94E+07

5.69E+07

5.35E+07

\

sqrt()

6.79E+07

6.83E+07

7.63E+07

5.59E+07

\

从数量级上来看,整数的加和乘能达到 1e9 次/秒 的数量级,而浮点数也能达到 1e8 次/秒 的数量级。

相比下,高精度就慢得多了,只能达到 1e6 次/秒 的数量级,比整数运算低了 3 个数量级。(所以 ACM 中,能用 __int128 就别用高精度)。

对于不同精度的整型和浮点型数据,加法上,int 比 long long 快约 7%,float 比 double 快约 14%。但是乘法上,long long 甚至比 int 快不到 1%,double 比 float 快 1%。都不是很明显。

对于 log 和 sqrt 函数来说,int 和 long long 反而可能比 float 和 double 慢。这可能是因为 C 语言并没有实现整型的 log 和 sqrt 函数,而是把整型强转为浮点数来进行计算。但是这几种数据类型的运算仍然在一个数量级。

测试三:数据范围对运算速度的影响

由于浮点数有移位的过程,所以可能数据范围对运算速度也有一定影响。

本次测试选用了 long long(做对照),float,double,BigInteger,分别从 1e7, 1e10, 1e14 开始累加量为 1,累加 1e9 次(或 1e7次,循环 100 遍)(BigInteger 由于过慢,只累加 1e7 次;float 由于上面提到的 1 溢出问题,只计算从 1e7 累加至 1.5e7)。

1s 运算次数

long long

float

double

BigInteger

1e7

2.03E+09

5.87E+08

5.97E+08

1.70E+06

1e10

2.02E+09

\

5.36E+08

1.08E+06

1e14

2.11E+09

\

5.31E+08

9.78E+05

1e100

\

\

\

3.32E+05

可以注意到,long long 的数据范围和运算速度关系确实不大;而double 会有影响:数据范围从 1e7 扩大到 1e14,运算速度下降了 11%,但是仍然在一个数量级内。

而 BigInteger 的影响同样也不大,即使是从 1e7 加到 1e100,运算速度也只下降了一个数量级。可能是其他操作比较慢

c语言 乘法计算速度,C++ 基本计算的速度相关推荐

  1. R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关系数、拟合回归模型使用两个回归模型的残差计算偏相关性系数

    R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关系数.拟合回归模型使用两个回归模型的残差计算偏相关性系数 目录

  2. R语言tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票月收益率数据条形图

    R语言tidyquant包的tq_transmute函数计算持有某只股票的天.月.周收益率.ggplot2使用条形图(bar plot)可视化股票月收益率数据条形图 目录

  3. R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型、或者pysch包计算偏相关系数(Partial Correlation)、通过方差分析获得偏相关系数的F统计量(偏F检验、二型检验)

    R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型.或者pysch包计算偏相关系数(Partial Correlation).通过方差分析获得偏相关系数的F统计量(偏F检验.二型检验) 目录

  4. R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关或者部分相关性系数并用建设检验检验相关性的显著性

    R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关或者部分相关性系数并用建设检验检验相关性的显著性 目录

  5. R语言复相关或者多重相关性系数计算实战:Multiple Correlation Coefficient

    R语言复相关或者多重相关性系数计算实战:Multiple Correlation Coefficient 目录 R语言复相关或者多重相关性系数计算实战:Multiple Correlation Coe ...

  6. 【计算理论】计算复杂性 ( 阶段总结 | 计算理论内容概览 | 计算问题的有效性 | 语言与算法模型 | 可计算性与可判定性 | 可判定性与有效性 | 语言分类 ) ★

    文章目录 一.计算理论内容概览 二.计算问题的 有效性 三.语言 与 算法模型 四.可计算性 与 可判定性 五.可判定性 与 有效性 六.语言分类 一.计算理论内容概览 计算理论分为 形式语言与自动机 ...

  7. 【计算理论】可判定性 ( 计算模型与语言 | 区分 可计算语言 与 可判定语言 | 证明 通用图灵机语言是 可计算语言 | 通用任务图灵机 与 特殊任务图灵机 )

    文章目录 一.计算模型与语言 二.区分 可计算语言 与 可判定语言 三.证明 ATM\rm A_{TM}ATM​ 语言 可计算 四.通用 ( Universal ) 任务图灵机 与 特殊任务图灵机 一 ...

  8. [转载] 语言程序设计第4版黄洪艺_计算机二级教程 Python语言程序设计 第8章python计算生态...

    参考链接: Python | 接球比赛 第八章学习知识导图 考点主要是: 1) 基本的Python内置函数 2) 了解Python计算生态 3) 作者归纳:这章看一下基本概念,主要认真看一下代码和代码 ...

  9. R语言学习-复杂网络中心度计算

    中心度概念说明: 指标名称 概念 比较 实际应用 点度中心度 在某个点上,有多少条线 强调某点单独的价值 ★作为基本点的描述 接近中心度 该点与网络中其他点距离之和的倒数,越大说明越在中心,越能够很快 ...

  10. 北理工嵩天Python语言程序设计笔记(10 Python计算生态概览)

    前言 本文是对<北理工 嵩天/黄天宇/礼欣 Python语言程序设计>的学习笔记,供自己查阅使用. 文章目录 北理工嵩天Python语言程序设计笔记(目录) 北理工嵩天Python语言程序 ...

最新文章

  1. DeepLearning.AI第一部分第四周:深层神经网络
  2. 高能!8段代码演示Numpy数据运算的神操作
  3. Hadoop 2.4.1 设置问题小结【原创】
  4. ARM Cortex-M0 原理与应用实践
  5. win10删除开机密码_取消WIN10开机密码的方法
  6. hihoCoder 1175 拓扑排序
  7. 华为java开发面试难不难,秀出天际!
  8. 阿里云技术团队原创力作震撼上市,强力解析云上Kubernetes!
  9. ArcGIS API for Silverlight 使用GeometryService进行河流网格划分(三)
  10. 第五章 线性回归 学习笔记下
  11. 【背包问题】基于matlab离散粒子群算法求解背包问题【含Matlab源码 423期】
  12. mysql jsp省市区三级联动_用jsp实现省市区三级联动下拉
  13. 1.30 fcntl函数
  14. 考研英语 词根词缀单词1-10
  15. Camera电路、图像传感器问题汇总
  16. VBA操作EXCEL根据单元格数值填充颜色
  17. linux虚拟串口控制器实现---适用于无开发板学习tty driver
  18. 手机做web服务器 无限流量,无限流量卡和手机随身无线wifi,你选择哪一个?
  19. 物理光学基础概念总结
  20. 小米一直显示在android,小米三刷机失败!开机一直显示power by android

热门文章

  1. Java开发设计模式
  2. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java随骑共享系统m7i8o
  3. origin2019插入图片_Origin绘图时在新图层中添加新图的方法
  4. 对象的创建、发布、逸出
  5. selenium详细介绍
  6. ubuntu18下孤儿进程的ppid不是1的问题
  7. 12306——(一)火车余票查询API
  8. CCRC信息安全服务资质认证涨价了?最新规定已发布,重点已经给你们划好了~
  9. C语言课设-----工资管理系统(附全部源码)
  10. 网康防火墙--上线指南_在线付款接受指南-第1部分