htt*_*tch 14 java performance fonts swing fontmetrics
我有个问题.如果我在那里使用东方语言我的应用程序界面工作得慢得多 特别是我觉得它在JList,JCombobox,JTable等组件中.
如果在文本中至少有一个字母是阿拉伯语或波斯语,我如何发现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;
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说它给出了下一个输出:
波斯语的计算时间:5482毫秒
英语计算时间:11毫秒
我使用您的代码对其他语言进行了一些测试。首先你是对的:波斯弦的计算花了很多时间。
我尝试了字体类型和大小,没有发现显着差异。但结果绝对取决于您使用的脚本。这是我在我的机器上得到的结果。
Calculation time for Persian: 2877 ms
Calculation time for English: 8 ms
Calculation time for Russian: 47 ms
Calculation time for Hebrew: 16815 ms
Run Code Online (Sandbox Code Playgroud)
如您所见,俄语比英语慢 6 倍。我相信这是因为字符串的内部表示是unicode。在UTF-8中英文字符占用1个字节,其他字符占用2个字节。
我不确定它能让你满意:)但是希伯来语测试比波斯语慢 4 倍。两者都很慢,所以我猜想从右到左的计算会杀死它。
看来我们和这件事没什么关系。
| 归档时间: |
|
| 查看次数: |
3414 次 |
| 最近记录: |