У меня проблема.Мой интерфейс приложения работает намного медленнее, если я использую там восточные языки.Особенно я чувствовал это в таких компонентах, как JList, JCombobox, JTable.
Как я обнаружил, что производительность метода FontMetrics.stringWidth очень медленная (более 500 раз), если в тексте хотя бы одна буква арабская или персидская.Насколько я знаю, это часто используемый метод в различных компонентах Swing.
Есть ли способ повысить производительность этого метода?
Вот пример класса, который демонстрирует проблему:
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 мс