在我们的观念当中,数组成员访问的时间复杂度是O(1),每个成员都可以一次定位,因此访问时间应该是一样的。

那如果我说,现在有一个一千万元素的数组,那么访问第一个元素与访问最后一样元素的时间是一样的吗?这个时候你会不会有所犹豫呢?

实际动手验证

实践是检验真理的唯一手段。空想没用,我们动手实际测试一下。我们实现如下所示的代码,在该代码中我们创建一个全局的数组,数组的大小是一千万个元素。然后分别对第一个元素和最后一个元素赋值,并在赋值前后记录时间。

#define BUF_SIZE 10000000 //一千万个元素

int test_array[BUF_SIZE] = {};

int main( int argc, char* argv[] )

{

long time1;

long time2;

time1 = get_time(); //获取时间,单位是纳秒

test_array[0] = 1; //访问第一个元素

time2 = get_time();

printf("access first item time: %ld", time2-time1);

time1 = get_time();

test_array[BUF_SIZE-1] = 1; //访问最后一个元素

time2 = get_time();

printf("access last item time: %ld", time2- time1);

return(0);

}

完成代码后,我们编译运行一下。为了得到稳定可靠的结果,我们多运行几次。得到的结果如下所示。

从测试结果可以看出,访问最后一个元素的性能明显要比访问第一个元素慢得多,有几十倍的性能差异!

原因分析

要想搞清楚上述问题的原因,需要更加深入的理解计算机的原理,包括可执行程序的内存布局、操作系统进程的原理以及硬件层面的一些知识。接下来我们将逐步介绍相关内容,抽丝剥茧,搞清楚为什么有如此明显的性能差异。

我们知道用户态的程序都是运行在虚拟空间的,每个程序都有自己4GB的虚拟空间。这个虚拟空间又称为虚拟内存。程序的虚拟内存并不是即刻分配的,而是按需分配。也就是说,只有在用户访问该部分内存的数据的时候,操作系统才会分配对应的物理内存,然后将数据加载到内存中。显然,这种从硬盘再读取数据的速度肯定要比直接访问内存慢的多。

现代的CPU为了提高系统采用了多级缓存和流水线技术。CPU会根据程序的指令运行情况将部分数据或者指令预加载到缓存当中,这样接下来就可以直接从从缓存读取数据了。

根据存储性能金字塔的数据,从缓存读取数据的性能是从内存读取性能的10倍以上。因此,如果代码没有规律,CPU无法预取数据和指令,那么程序的运行效率肯定会很低。

扯了这么远,让我们回到题目本身。由于这里数组比较大,因此当访问第一个元素的时候,第一千万个元素肯定是没有被预读的,之后访问该数据大概率会发生缺页中断。所以,访问第一个元素和最后一个元素在性能上是有差异的。

进一步的验证

有了上面的分析,我们可以再做进一步的验证。比如我们可以连续两次访问最后一个元素,看看两者的区别。

int main( int argc, char* argv[] )

{

long time1;

long time2;

time1 = get_time();

test_array[0] = 1;

time2 = get_time();

printf("access first item time: %ld", time2-time1);

time1 = get_time();

test_array[BUF_SIZE-1] = 1; // 第一次访问最后一个元素

time2 = get_time();

printf("access last item time: %ld", time2- time1);

time1 = get_time();

test_array[BUF_SIZE-1] = 1; // 第二次访问最后一个元素

time2 = get_time();

printf("access last item time: %ld", time2- time1);

return(0);

}

修改完代码之后,执行该程序。同样,我们多次执行该程序,确保结果稳定。通过下面执行结果可以看到,在第二次执行是其时间与访问第一个元素相当,已经没有那么明显的差异了。

通过上面的学习,大家是不是觉得深入学习计算机原理层面的重要性了。关于更多计算机深层次的内容,我们后面会继续分享给大家。如果大家觉得有用,还请关注本号。

数组指定位置添加元素_访问数组的任意位置元素的性能真的一样?相关推荐

  1. vba数组如何精确筛选_利用数组和字典,实现按指定规则的排序

    大家好,今日我们继续讲解数组与字典解决方案,今日讲解第47讲:利用字典和数组,实现按指定规则的排序.随着字典讲解的深入,我们发现字典真的很神奇,在VBA代码中,给人以十分清爽的感觉,在这套数组与字典解 ...

  2. vb 实现二维数组(矩阵)转置。_笃学不倦|数组的定义

    Hi~ o(* ̄▽ ̄*)ブ艾睿宝迪,又和大家见面了.这节课讲讲关于数组的那些事儿! 咳咳,今天这节课非常重要,请大家认真听讲并记好笔记呦!现在老司机带大家开车了! 数组可以看成是一种特殊的线性表,其特 ...

  3. 数组指定位置添加元素_数据结构--顺序表的9种基本运算,初始化,销毁,判断是否为空表,长度,求指定位置的元素值......

    成功实现后的示意图为: 代码为: // 线性表-顺序表.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. //顺序表的9种基本运算 #include &qu ...

  4. c#给定二维数组按升序排序_在数组中按升序对数字进行排序| 8086微处理器

    c#给定二维数组按升序排序 Problem: Write a program in 8086 microprocessor to sort numbers in ascending order in ...

  5. python数组乘以一个字符串_一个数组乘以一个元素

    使用示例数组:In [220]: arr = np.arange(5*5*3).reshape(5,5,3) 基本索引是最有效的方法(这将是view) ^{pr2}$ [1,0,0]列表不是您想要的. ...

  6. java中引用数组元素时 数组下标可以是_引用数组元素时,数组下标可以是( )...

    摘要: .引用元素顾公众它包者和竞争业内应商企业部因外部的供等因素和素括企客.引用元素,相互系环境活动内部各部关系作.之间门之间以及与竞争营销有协企业企业企业微观务等的关.服是指.下标叙述功方罗汉的练 ...

  7. java数组是否为空_判断数组是否为空的五大方法

    判断数组是否为空的五大方法 对于勇士来说,贫病.困窘.责难.诽谤.冷嘲热讽,一切压迫都是前进的动力,以下是小编为大家搜索整理的判断数组是否为空的五大方法,希望能给大家带来帮助!更多精彩内容请及时关注我 ...

  8. JS删除数组指定下标并添加到数组开头

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 代码 let id = e.currentTarget.dataset.idlet arrays = '';l ...

  9. 百度地图获取当前位置街道_轻松查看街道地址位置地图

    百度地图获取当前位置街道 Have you found the address for a place that you would like to visit while browsing but ...

最新文章

  1. Nginx —— nginx负载均衡的详细配置 以及 使用案例详解.
  2. bool 变量想为什么一般初始化为FALSE 比较好?
  3. 2.Maven特点,Maven约定,建立第一个Maven项目
  4. Linux环境下安装jenkins
  5. LeetCode Algorithm 386. 字典序排数
  6. 第四章 治病法要(1)
  7. P2216 [HAOI2007]理想的正方形(二维RMQ)
  8. 打开新经济大门 淘宝直播如何打造最有价值的直播平台?
  9. Spring MVC 4.x 知识点
  10. 等保2.0 安全计算环境 ——Windows服务器(三级系统)
  11. 《目标检测蓝皮书》第4篇 经典热门网络结构
  12. java毕业生设计眼科医疗室信息管理系统计算机源码+系统+mysql+调试部署+lw
  13. DiscuzX2.5,X3.0,X3.1,X3.2完整目录结构【模板目录template】
  14. 如何阅读一本书-【未排版!】
  15. 计算机软件监控器,上位监控计算机软件,Upper monitoring computer software,音标,读音,翻译,英文例句,英语词典...
  16. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
  17. springboot电子邀请函制作
  18. 打死都不要进外包,看看我在阿里外包的2年…
  19. 自动安装第三方库python,python第三方库自动安装脚本
  20. 第 20 题:请描述一下 BFC、IFC、GFC 和 FFC 的区别?

热门文章

  1. 腾讯云联合信通院等发布标准物模型平台,构建物联网行业通用标准
  2. 直播、线上办公、IoT需求井喷,Wi-Fi 6如何防止网络“塞车”?
  3. OpenStack基金会 ( OSF)演进为开源基础设施基金会
  4. 终极解密!输入网址按回车到底发生了什么?
  5. 2020已过大半,量子计算机发展如何了?
  6. 万字长文揭秘 ARM 32 内核是如何启动的!
  7. 停滞数年后,ElasticJob 携首个 Apache 版本 3.0.0-alpha 回归!
  8. 当各大编程语言摆起地摊来……
  9. 讯飞智能语音先锋者:等到人机交互与人类交流一样自然时,真正的智能时代就来了!...
  10. JavaScript 你必须了解的主流趋势!