1

我正在尝试创建类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();

有没有加快这个速度?

4

3 回答 3

0

基于

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

这比慢 100 倍

int y = OutterClass.y, x = OutterClass.x;

看来您可以通过删除无用的工作来优化代码。那会让它更快。

我建议您使用 CPU 和内存分析器来查看您大部分时间都花在了哪里。

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

于 2013-09-08T16:40:33.453 回答
0

After a lot of research, someone suggested to pre-load the files. I tried it and it runs significantly faster. So here is what I did

  1. First, when I ran my program, I loaded every file I would use into a hashmap. This slowed down the loading speed, but it is better than what I had before: loading each file when it was needed, which led to reading the same file thousands of times.

  2. Then, each tile would get the info it needed from the hashmap.

Also, I agree that using separate threads is really inefficient.

于 2013-11-02T21:02:55.097 回答
0

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

循环你的瓷砖和submit每个Runnable瓷砖。调用submit返回 a Future- 将这些中的每一个放入 aList<Future<?>中。

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

于 2013-09-08T17:29:27.707 回答