作为一名非计算机科班出身的程序员对计算机的底层架构知之甚少,开发也一直以Java程序为主,写代码的时候很少考虑底层操作系统和硬件什么的。
直到今天开始学习Disruptor框架,里面提到了很多Cache的相关内容,才发现Java程序原也应该懂得计算机结构等基础知识!学习到Cache Line的概念,突然想到了以前看到的神奇的提高循环执行速度的神奇的7!
64位机器的Cache Line中可以保存8个word, 这是不是和神奇的7有关系呢?
我的64位计算机现在装的是32位的系统,那对我来说是3比较起作用,还是7比较起作用呢?
于是有了如下的一个简单实验
package com.eric.learn.javacore.test; public class FunLoop { public static void main(String[] args) { long[] huge_array = new long[(int) Math.pow(2, 25)]; buildHugeArray(huge_array); sequenceVisit(huge_array); batchVisitBy3(huge_array); batchVisitBy7(huge_array); } private static void batchVisitBy3(long[] huge_array){ long start = System.currentTimeMillis(); long length = huge_array.length; long loop_times = length - length % 3; for(int i = 0; i < loop_times; i+= 3){ long l = huge_array[i]; l = huge_array[i + 1]; l = huge_array[i + 2]; } long end = System.currentTimeMillis(); System.out.println("3 times batch visit cost " + (end -start) + " milliseconds"); } private static void batchVisitBy7(long[] huge_array) { long start = System.currentTimeMillis(); long length = huge_array.length; long loop_times = length - length % 7; for(int i = 0; i < loop_times; i+= 7){ long l = huge_array[i]; l = huge_array[i + 1]; l = huge_array[i + 2]; l = huge_array[i + 3]; l = huge_array[i + 4]; l = huge_array[i + 5]; l = huge_array[i + 6]; } long end = System.currentTimeMillis(); System.out.println("7 times batch visit cost " + (end -start) + " milliseconds"); } private static void sequenceVisit(long[] huge_array) { long start = System.currentTimeMillis(); long length = huge_array.length; for(int i =0 ; i< length; i++){ long l = huge_array[i]; } long end = System.currentTimeMillis(); System.out.println("sequence visit cost " + (end -start) + " milliseconds"); } private static void buildHugeArray(long[] huge_array) { for(int i=0; i < huge_array.length; i++){ huge_array[i] = (long) (Math.random() * Integer.MAX_VALUE); } } }
为了逻辑简单,在3或7批量的时候,忽略掉了最后的不再一个Loop内的内容。
然后是在我机器上的输出
sequence visit cost 50 milliseconds 7 times batch visit cost 17 milliseconds 3 times batch visit cost 30 milliseconds
还是跟最终的硬件结构相关!如果将来有了128位机器,那是不是最快的循环就是127了呢?
相关推荐
7. **函数与自定义积木**:Scratch允许用户创建自己的“积木块”或函数,封装一组常见的操作,提高代码的复用性和可读性。 8. **脚本区域**:在这里,你可以组合积木块,编写程序。每个角色都有独立的脚本区,可以...
8. C++不是魔法 - 开发者应该理解C++的内部工作原理,而不是将其视为一种神奇的语言。 9. C++不是面向对象的 - C++支持多种编程范式,包括过程化、面向对象、泛型和元编程等。 10. 学习另一种语言 - 通过学习不同...
6. 游戏循环:为了让游戏持续进行,可以设计一个循环结构,让玩家在猜对当前神奇宝贝后立即开始新的一轮。 在“guess-the-pokemon-main”目录中,我们可以找到项目的源代码文件,包括HTML、CSS和JavaScript。HTML...
20. **自然现象解释**:“海枯,石烂,日转,星移”是形容时间的流逝和自然环境的变化,可以选取其中任一方面,如“日转”来讨论地球自转和公转带来的日夜交替。 【知识链接】 1. **主题解读**:诗歌的主题是赞美...
然而,广告并非直接引发销售量激增的“神奇武器”,而是通过其独特的方式增强品牌价值,影响消费者的购买决策。为了达到这一目的,市场调研在广告策划中扮演着至关重要的角色。它不仅帮助我们深入理解目标消费者,...
首先,函数在JavaScript中被视为一等公民,意味着函数可以被赋值给变量、作为参数传递给其他函数以及作为其他函数的返回值。例如,在JavaScript中,我们可以将函数赋值给变量,如`var add = function (a, b) { ...
1. **基础语法**:JavaScript的基础包括变量、数据类型(如字符串、数字、布尔、null、undefined)、操作符、流程控制(条件语句、循环语句)以及函数。 2. **DOM操作**:文档对象模型(DOM)是HTML和XML文档的编程...
本项目我们将探讨如何利用SwiftUI结合PokeAPI,打造一款功能丰富的Pokedex应用,帮助用户探索并了解《精灵宝可梦》(Pokémon)世界中的各种神奇生物。 1. SwiftUI基础知识: SwiftUI是Apple在2019年推出的一种声明...
在这种情况下,程序会发送数字1到数字100,这可能意味着程序会为每一个数字创建一个单独的数据包,并使用TCP进行传输。 在UNIX网络编程中,TCP套接字的创建、连接和通信通常涉及以下步骤: 1. **创建套接字**:...