我正在尝试创建数千个类的实例, 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();
有加速吗?
答案 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)
经过大量研究,有人建议预先加载文件。我尝试过它,运行得更快。 所以这就是我做的事情
首先,当我运行程序时,我将每个要使用的文件加载到 HashMap中。这个 减慢加载速度,但它比我的要好 之前:在需要时加载每个文件,这导致阅读 相同的文件数千次。
然后,每个图块都会从hashmap中获取所需的信息。
另外,我同意使用单独的线程效率非常低。