Question

In my current project (OpenGL Voxel Engine) I have a serious issue when generating models. I have a very object oriented structure, meaning that even single parameters of my vertices are Objects. This way I am creating about 75000 Objects for 750 voxels in about 5 seconds. Is Java really this slow when allocating new Objects or do I miss a big failure somewhere in my code?

Was it helpful?

Solution

Very big question. Generally speaking, it depends from the object class definition and by the amount of work required to construct object.

Some issue:

  1. avoid finalize method,
  2. tune memory and GC in order to avoid excessive GC activity,
  3. avoid big work during constructor,
  4. do not use syncronization call during object construction,
  5. use Weak references

these issues solved my problem.

See also http://oreilly.com/catalog/javapt/chapter/ch04.html

Finally let me suggest you the (deprecated) Object Pool pattern or reuse objects.

Concluding, no, generally speaking, java object creation is not slow

OTHER TIPS

Simply creating 75,000 objects should not take 5 seconds. Take a look at the work your constructor is doing. What else are you doing during this time besides creating the objects? Have you tried timing the code to pinpoint where delays occur?

Of course it isn't. The following code allocates 10 million objects and stores them in an array. On my 5 year old notebook, it completes in 1.4 seconds.

public class Test {
    public static void main(String[] args) {
        Object[] o = new Object[10_000_000];
        long start = System.nanoTime();
        for (int i = 0; i < o.length; i++) {
            o[i] = new Object();
        }
        long end = System.nanoTime();
        System.out.println(Arrays.hashCode(o));
        System.out.println(new BigDecimal(end - start).movePointLeft(9));
    }
}

... and that's even though this benchmark is quite naive in that it doesn't trigger just in time compilation of the code under test before starting the timer.

Objects will be slower than primitives, and they will also consume considerably more memory - so it's possible you are going overboard on them. It's hard to say without seeing more details.

75000 objects will not take a long time to create though, try this:

List<Integer> numbers = new ArrayList<Integer>();
    for(int i = 0;i<75000;i++){
        numbers.add(i); // Note this will autobox creating an Integer object after the first 128
    }
    System.out.println(numbers.size());
}

http://www.tryjava8.com/app/snippets/52d070b1e4b004716da5cb4f

Total time taken less than a second.

When I put the number up to 7,500,000 it finally took a second...

The new operator in java is very fast compared to the common approach in languages without automatic memory management (e.g. the new operator is usually faster than the malloc-command in C because it does not need a system call).

Although the new operator can still be a bottleneck, it is certainly not the problem in your case. Creating 75K objects should be WAY faster than 5 seconds.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top