我遇到问题。如果我在那里使用东方语言,我的应用程序界面工作会更慢特别是我觉得它在JList,JCombobox,JTable等组件中。如果文本中有阿拉伯文或波斯文字符,通过fontmetrics计算的字符串宽度非常慢
如果在文本中至少有一个字母是阿拉伯语或波斯语,我如何发现FontMetrics.stringWidth方法的性能很慢(500+倍)。我怎么知道它是各种摆动部件中常用的方法。
有没有办法提高这种方法的性能?
这里是例子类演示此问题:
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
public class FontMetricsSpeedTest
{
public static void main(String args[]) {
String persian="صصصصصصصصصصصصصصصصصصصصص";
String english="abcde()agjklj;lkjelwk";
FontMetrics fm=createFontMetrics(new Font("dialog",Font.PLAIN,12));
int size=50000;
long start=System.currentTimeMillis();
for(int i=0;i<size;i++)
{
fm.stringWidth(persian);
}
System.out.println("Calculation time for persian: "+(System.currentTimeMillis()-start)+" ms");
start=System.currentTimeMillis();
for(int i=0;i<size;i++)
{
fm.stringWidth(english);
}
System.out.println("Calculation time for english: "+(System.currentTimeMillis()-start)+" ms");
}
private static FontMetrics createFontMetrics(Font font)
{
BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics g = bi.getGraphics();
FontMetrics fm = g.getFontMetrics(font);
g.dispose();
bi = null;
return fm;
}
}
对我来说,它提供了一个输出:
计算时间波斯语:5482毫秒
计算时间英语:11毫秒
但是至少500倍杀死性能:( – httpdispatch 2010-12-02 10:17:50
只同意如果真要计算数千个指标比较慢。如果你有10个在屏幕上的线条并不重要:绘制UI控件也需要时间。顺便说一句,如果你找到解决方案发布在这里,我很想知道... – AlexR 2010-12-02 10:26:55
我认为解决方案将在重写和进一步取代太阳。 font.FontDesignMetrics类可能会添加一些缓存,但看起来并不那么容易 – httpdispatch 2010-12-02 12:48:53