草庐IT

Java:多维数组与一维

coder 2023-05-17 原文

例如:

  • a) int [x][y][z]

  • b) int[x*y*z]

为了简单起见,我最初认为我会选择 a)。

我知道 Java 不像 C 那样将数组线性存储在内存中,但这对我的程序有什么影响?

最佳答案

在搜索此类问题的答案时,通常最好的办法是查看这些选项是如何编译成 JVM 字节码的:

multi = new int[50][50];
single = new int[2500];

这被翻译成:

BIPUSH 50
BIPUSH 50
MULTIANEWARRAY int[][] 2
ASTORE 1
SIPUSH 2500
NEWARRAY T_INT
ASTORE 2

所以,如您所见, JVM 已经知道我们说的是多维数组。

继续下去:

for (int i = 0; i < 50; ++i)
    for (int j = 0; j < 50; ++j)
    {
        multi[i][j] = 20;
        single[i*50+j] = 20;
    }

这被翻译(跳过循环)成:

ALOAD 1: multi
ILOAD 3: i
AALOAD
ILOAD 4: j
BIPUSH 20
IASTORE

ALOAD 2: single
ILOAD 3: i
BIPUSH 50
IMUL
ILOAD 4: j
IADD
BIPUSH 20
IASTORE

所以, 如你看到的, 多维数组在 VM 内部处理, 没有无用指令产生的开销, 而使用单个则使用更多指令,因为偏移量是手动计算的。

我认为性能不会成为这样的问题。

编辑:

我做了一些简单的基准测试来看看这里发生了什么。 我选择尝试不同的例子: 线性读取, 线性写入, 和随机访问。 时间以毫秒表示(并使用 System.nanoTime() 计算。 结果如下:

线性写入

  • 尺寸:100x100 (10000)
    • 多个:5.786591
    • 单例:6.131748
  • 尺寸:200x200 (40000)
    • 多路:1.216366
    • 单人:0.782041
  • 尺寸:500x500 (250000)
    • 多路:7.177029
    • 单例:3.667017
  • 尺寸:1000x1000 (1000000)
    • 多个:30.508131
    • 单例:18.064592
  • 尺寸:2000x2000 (4000000)
    • 多路:185.3548
    • 单例:155.590313
  • 尺寸:5000x5000 (25000000)
    • 多路电话:955.5299
    • 单例:923.264417
  • 尺寸:10000x10000 (100000000)
    • 多个:4084.798753
    • 单例:4015.448829

线性读取

  • 尺寸:100x100 (10000)
    • 多路:5.241338
    • 单例:5.135957
  • 尺寸:200x200 (40000)
    • 多:0.080209
    • 单人:0.044371
  • 尺寸:500x500 (250000)
    • 多:0.088742
    • 单个:0.084476
  • 尺寸:1000x1000 (1000000)
    • 多:0.232095
    • 单人:0.167671
  • 尺寸:2000x2000 (4000000)
    • 多:0.481683
    • 单人:0.33321
  • 尺寸:5000x5000 (25000000)
    • 多路:1.222339
    • 单例:0.828118
  • 尺寸:10000x10000 (100000000)
    • 多路:2.496302
    • 单例:1.650691

随机读取

  • 尺寸:100x100 (10000)
    • 多个:22.317393
    • 单例:8.546134
  • 尺寸:200x200 (40000)
    • 多个:32.287669
    • 单例:11.022383
  • 尺寸:500x500 (250000)
    • 多:189.542751
    • 单例:68.181343
  • 尺寸:1000x1000 (1000000)
    • 多:1124.78609
    • 单例:272.235584
  • 尺寸:2000x2000 (4000000)
    • 多路电话:6814.477101
    • 单例:1091.998395
  • 尺寸:5000x5000 (25000000)
    • 多个:50051.306239
    • 单例:7028.422262

随机数有点误导,因为它为多维数组生成 2 个随机数,而为一维数组生成一个随机数(PNRG 可能会消耗一些 CPU)。

请注意,我试图让 JIT 仅在同一循环的第 20 次运行后进行基准测试。为了完整起见,我的 java VM 如下:

java version "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

关于Java:多维数组与一维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2512082/

有关Java:多维数组与一维的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  7. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  8. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐