Why doesn't Java have true multidimensional arrays?

前端 未结 6 1116
夕颜
夕颜 2020-12-05 06:57

The TL;DR version, for those who don\'t want the background, is the following specific question:

Question

Why doesn\'t Java have an implemen

6条回答
  •  旧巷少年郎
    2020-12-05 07:15

    I am unable to reproduce the performance benefits you claim. Specifically, the test program:

    public abstract class Benchmark {
    
        final String name;
    
        public Benchmark(String name) {
            this.name = name;
        }
    
        abstract int run(int iterations) throws Throwable;
    
        private BigDecimal time() {
            try {
                int nextI = 1;
                int i;
                long duration;
                do {
                    i = nextI;
                    long start = System.nanoTime();
                    run(i);
                    duration = System.nanoTime() - start;
                    nextI = (i << 1) | 1;
                } while (duration < 1000000000 && nextI > 0);
                return new BigDecimal((duration) * 1000 / i).movePointLeft(3);
            } catch (Throwable e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public String toString() {
            return name + "\t" + time() + " ns";
        }
    
        public static void main(String[] args) throws Exception {
            final int[] flat = new int[100*100*100];
            final int[][][] multi = new int[100][100][100];
    
            Random chaos = new Random();
            for (int i = 0; i < flat.length; i++) {
                flat[i] = chaos.nextInt();
            }
            for (int i=0; i

    run on my workstation with

    java version "1.8.0_05"
    Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
    

    prints

    flat              264360.217 ns
    multi             270303.246 ns
    multi (idiomatic) 266607.334 ns
    

    That is, we observe a mere 3% difference between the one-dimensional and the multi-dimensional code you provided. This difference drops to 1% if we use idiomatic Java (specifically, an enhanced for loop) for traversal (probably because bounds checking is performed on the same array object the loop dereferences, enabling the just in time compiler to elide bounds checking more completely).

    Performance therefore seems an inadequate justification for increasing the complexity of the language. Specifically, to support true multi dimensional arrays, the Java programming language would have to distinguish between arrays of arrays, and multidimensional arrays. Likewise, programmers would have to distinguish between them, and be aware of their differences. API designers would have to ponder whether to use an array of arrays, or a multidimensional array. The compiler, class file format, class file verifier, interpreter, and just in time compiler would have to be extended. This would be particularly difficult, because multidimensional arrays of different dimension counts would have an incompatible memory layout (because the size of their dimensions must be stored to enable bounds checking), and can therefore not be subtypes of each other. As a consequence, the methods of class java.util.Arrays would likely have to be duplicated for each dimension count, as would all otherwise polymorphic algorithms working with arrays.

    To conclude, extending Java to support multidimensional arrays would offer negligible performance gain for most programs, but require non-trivial extensions to its type system, compiler and runtime environment. Introducing them would therefore have been at odds with the design goals of the Java programming language, specifically that it be simple.

提交回复
热议问题