У меня проблема. Мой интерфейс приложения работает намного медленнее, если я использую восточные языки там. Особенно я ощущал это в таких компонентах, как 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;
}
}
Для меня это дает следующий вывод:
Время вычисления для персидского языка: 5482 мс
Время расчета для английского: 11 мс