在运行时性能方面最有效的方法是初始化数千个对象

时间:2013-09-08 16:34:36

标签: java multithreading performance runtime

我正在尝试创建数千个类的实例, Tile

int length=64;
Tile tiles[][]=new Tile[length][length]
for(int y=0;y<length;y++)for(int x=0;x<length;x++)
    try{tiles[x][y]=new Tile(x,y);}catch(FileNotFoundException e) {e.printStackTrace();}

创建新图块需要0.01到0.1秒之间的任何时间。

我尝试为此创建一个线程,但它使它变慢了。

tiles=new Tile[length][length];
private static int y,x;
final CountDownLatch end=new CountDownLatch(length*length);
for( y=0;y<tiles.length;y++)for(x=0;x<tiles.length;x++)
    new Thread()
    {
        public void run()
        {
                int y=new Integer(OutterClass.y),x=new Integer(OutterClass.x);      
            try {
                tiles[x][y]=new Tile(x,y);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
                end.countDown();
        }
    }.start();
end.await();

有加速吗?

3 个答案:

答案 0 :(得分:0)

基于

int y=new Integer(OutterClass.y),x=new Integer(OutterClass.x);

慢100倍
int y = OutterClass.y, x = OutterClass.x;

看来你可以通过取出没有用处的工作来优化代码。这会让它变得更快。

我建议你使用CPU和内存分析器来查看你花费大部分时间的地方。

如果您的程序主要在IO中,则使用更多线程会降低程序速度。在这种情况下,您需要减少IO或购买更快的驱动器。尝试创建更少的文件。

答案 1 :(得分:0)

创建一个线程池(例如,可能通过ThreadPoolExecutor获得的Executors.newFixedThreadPool(int))。将线程数设置为适合您的应用程序和执行环境的内容。

遍历您的图块,并为每个图块submit Runnable。致submit的回复会返回Future - 将其中的每一项都归入List<Future<?>

循环遍历Future<?>列表并在每个列表上调用get()。此步骤确保在您继续之前完成所有任务。

答案 2 :(得分:0)

经过大量研究,有人建议预先加载文件。我尝试过它,运行得更快。 所以这就是我做的事情

  1. 首先,当我运行程序时,我将每个要使用的文件加载到 HashMap中。这个     减慢加载速度,但它比我的要好     之前:在需要时加载每个文件,这导致阅读     相同的文件数千次。

  2. 然后,每个图块都会从hashmap中获取所需的信息。

  3. 另外,我同意使用单独的线程效率非常低。