这代码居然有差别?CPU友好的代码该这样写(1)

简介: 这代码居然有差别?CPU友好的代码该这样写

image.png

本文用实际用例阐述了用心组织的代码也能让性能提升百倍,我们不应该停留在CRUD的漩涡中。下面来看看这个神奇的现象。


一、震惊,这代码居然有差别!

CPU友好的代码与我们平时的那些CRUD操作可能没啥关系。但是用心组织的代码其实也能让性能提升百倍。我们不应该停留在CRUD的漩涡中。今天我给大家带来一个很神奇的现象,文章不长,原理通用,还请大家耐心看完!

我们可以先看下面的矩阵计算。

大家也可以自己思考一下,如果是你来实现一个矩阵的乘法,你会怎么来做。

下图是我给出的A、B、C 三个解题的思路。大家觉得在Jvm里面,下面的代码性能会有区别么?如果有的话,哪一个会快一点?如果没有的话,又为什么?

image.png

这里停顿两秒。

/...1

/...2

现在是公布答案的时间,下图是benchmark运行的结果(具体的运行代码和结果查看文末的附件),是否和你想的一样呢。

image.png

x轴是计算数组的大小。y轴是所消耗的时间。

最上两条线是 B 代码块儿的结果,中间是 A 代码块儿的结果,最下面是 C 代码块儿的结果。

从运行时间角度看结果是:TC < TA < TB。从性能角度看结果是:PC > PA > PB。

大家猜对结果了么?是不是很你想的一样呢?

如果不是的话,那就慢慢往下面看吧。


二、为什么会有性能差别?

要想知道这个问题的答案,我们需要知道两个知识点,缺一不可。

  • 首先,我们需要知道Java二维数组的存储结构是什么样子的。
  • 其次,我们需要知道CPU在计算的时候它L1、L2、L3的缓存机制。

2.1 知识点

2.1.1 知识点一 -- Java二维数组的存储结构

下图便是Java二维数组的一个存储方式示意图,意思是 int[][] array_A = new int[4][3]。

image.png

在一个数组里面存的都是“指针”,指向真实存放数据的地址块。

每一行的数据是连续的地址,但是行与行之间的地址就不一定连续了。这一点很重要,后面会用到。

2.1.2 知识点二 -- CPU的缓存机制

CPU架构是会演进的,高低端的参数也不一定相同。但我们毕竟不是CPU的制造者,不必每一个CPU都去细扣,我们只需要理解他的原理,在适当的时候做一些抽象方便理解就可以了。

下图是我当前Mac的CPU参数,大家需要注意2个东西,L2缓存、L3缓存。这2个参数就是影响我们今天讨论的性能的主要因素。

image.png

下面是各个缓存的CPU的访问时间:

image.png

目录
相关文章
|
Java Linux
linux中找到最耗CPU的那段Java代码
linux中找到最耗CPU的那段Java代码
|
2月前
|
调度
CPU调度器实现提示:针对特定体系结构代码【ChatGPT】
CPU调度器实现提示:针对特定体系结构代码【ChatGPT】
|
4月前
|
机器学习/深度学习 TensorFlow API
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
|
5月前
|
并行计算 异构计算 Python
python代码torch.device("cuda:0" if torch.cuda.is_available() else "cpu")是什么意思?
【6月更文挑战第3天】python代码torch.device("cuda:0" if torch.cuda.is_available() else "cpu")是什么意思?
491 4
|
6月前
|
Java Linux
Linux下如何定位最耗CPU的JAVA代码
Linux下如何定位最耗CPU的JAVA代码
78 0
|
11月前
|
监控 数据可视化 Java
双CPU监控的目的以及主流编程语言实现代码示例
监控CPU使用率可以帮助检测系统瓶颈和性能问题,有助于及时识别并解决故障。
484 2
|
监控 调度 Python
电脑监控软件所含的CPU资源监控的代码(使用psutil库)
本文使用psutil库来获取CPU使用率、运行的进程、CPU温度、风扇速度和CPU核心的工作情况。这些信息可用于自定义电脑监控软件的CPU资源监控功能
557 1
|
1天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
|
10天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
179 1
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
111 5
下一篇
无影云桌面