Does this mean that Java Math.floor is extremely slow?

后端 未结 5 1646
花落未央
花落未央 2020-12-15 19:44

I don\'t Java much.

I am writing some optimized math code and I was shocked by my profiler results. My code collects values, interleaves the data and then chooses th

5条回答
  •  感动是毒
    2020-12-15 20:33

    First of all: Your profiler shows that your spending 99% of the cpu time in the floor function. This does not indicate floor is slow. If you do nothing but floor() thats totally sane. Since other languages seem to implement floor more efficient your assumption may be correct, however.

    I know from school that a naive implementation of floor (which works only for positive numbers and is one off for negative ones) can be done by casting to an integer/long. That is language agnostic and some sort of general knowledge from CS courses.

    Here are some micro benches. Works on my machine and backs what I learned in school ;)

    rataman@RWW009 ~/Desktop
    $ javac Cast.java && java Cast
    10000000 Rounds of Casts took 16 ms
    
    rataman@RWW009 ~/Desktop
    $ javac Floor.java && java Floor
    10000000 Rounds of Floor took 140 ms
    
    #
    public class Cast/Floor {
    
        private static final int ROUNDS = 10000000;
    
        public static void main(String[] args)
        {
            double[] vals = new double[ROUNDS];
            double[] res = new double[ROUNDS];
    
            // awesome testdata
            for(int i = 0; i < ROUNDS; i++)
            {
                vals[i] = Math.random() * 10.0;
            }
    
            // warmup
            for(int i = 0; i < ROUNDS; i++)
            {
                res[i] = floor(vals[i]);
            }
    
            long start = System.currentTimeMillis();
            for(int i = 0; i < ROUNDS; i++)
            {
                res[i] = floor(vals[i]);
            }
            System.out.println(ROUNDS + " Rounds of Casts took " + (System.currentTimeMillis() - start) +" ms");
        }
    
        private static double floor(double arg)
        {
            // Floor.java
            return Math.floor(arg);
            // or Cast.java
            return (int)arg;
        }
    

    }

提交回复
热议问题