如果文本中有阿拉伯语或波斯语字母,则通过fontmetrics计算的字符串宽度非常慢

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毫秒

Ale*_*exR 3

我使用您的代码对其他语言进行了一些测试。首先你是对的:波斯弦的计算花了很多时间。

我尝试了字体类型和大小,没有发现显着差异。但结果绝对取决于您使用的脚本。这是我在我的机器上得到的结果。

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 倍。两者都很慢,所以我猜想从右到左的计算会杀死它。

看来我们和这件事没什么关系。