RFR: 8090110: Very bad TextArea of performance in a language environment that uses the Chinese character (KANJI)
yosbits
github.com+7517141+yososs at openjdk.java.net
Mon Sep 28 12:01:14 UTC 2020
* https://bugs.openjdk.java.net/browse/JDK-8090110
* https://bugs.openjdk.java.net/browse/JDK-8089418
TextArea slows down as the number of characters increases. This problem can be greatly improved by setting the clip of
the display area. It also improves performance when increasing the font size.
The TextArea performance improvement from this change can be seen even when dealing with Latin characters only.
In the change, the Clip area is bound only vertically. When binding horizontally, a stack overflow occurs when resizing
the window.This looks like a potential problem with the Text control.
A fix for this problem can be found in the next test.
Java
import java.util.Random;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class BigTextAreaTest extends Application {
// private static final int TEST_TEXT_LENGTH = 1*1024*1024; // 1MB
private static final int TEST_TEXT_LENGTH = 100*1024; // 100KB
private static final String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static final String number = "0123456789";
private static final String hiragana = "ããããããããããããããããã¡ã¤ã¦ã¨ãªã«ã¬ãã®ã¯ã²ãµã¸ã»ã¾ã¿ãããããããããããããã";
private static final String katakana = "ã¢ã¤ã¦ã¨ãªã«ãã¯ã±ã³ãµã·ã¹ã»ã½ã¿ããããããããããããããããã ã¡ã¢ã¤ã¦ã¨ã©ãªã«ã¬ãã¯ã²ã³";
private static final String jis_lv1 =
"äºåå¨é¿åææ¨å§¶é¢èµèç©æªæ¡æ¸¥æè¦è¦é¯µæ¢å§æ¡æ±å®å§è»é£´çµ¢ç¶¾é®æç²è¢·å®åºµæææ¡ééæ以ä¼ä½ä¾åå²å¤·å§å¨å°æææ
°ææ¤
çºçç°ç§»ç¶ç·¯èèè¡£è¬ééºå»äºäº¥åè²é磯ä¸å£±æº¢é¸ç¨²è¨èé°¯å
å°å½å¡å 姻å¼é£²æ·«è¤èé¢é°é é»åå³å®çç¾½è¿é¨å¯éµçªºä¸ç¢è¼æ¸¦ååæ¬è鰻姥å©æµ¦çéåäºéé²èé¤å¡å¶å¬°å½±æ æ³æ 永泳洩ççç©é ´è±è¡è© é液ç«çé§
æ¦è¬è¶é²æ¦åååå °å¥å®´å»¶æ¨æ©æ´æ²¿æ¼ççç
çç¿ç¸è¶èèé éé´å¡©æ¼æ±ç¥å¹å¤®å¥¥å¾å¿æ¼æºæ¨ªæ¬§æ®´çç¿è¥é´¬é´é»å²¡æ²è»åå±æ¶è桶ç¡ä¹ä¿ºå¸æ©æ¸©ç©é³ä¸åä»®ä½ä¼½ä¾¡ä½³å å¯åå¤å«å®¶å¯¡ç§æææ¶ææ²³ç«çç¦ç¦¾ç¨¼ç®è±èèè·è¯èè¦èª²å©è²¨è¿¦ééèä¿å³¨æçç»è¥è½è¾è³é
é¤é§ä»ä¼è§£åå¡å£å»»å¿«æªææ¢ææææ¹éæ¦æ¢°æµ·ç°çççµµè¥è¹ééè²å±å¾å¤å³å®³å´æ
¨æ¦æ¶¯ç¢èè¡è©²é§éª¸æµ¬é¦¨èå£æ¿èéåååå»æ¡æ¹æ ¼æ ¸æ®»ç²ç¢ºç©«è¦è§èµ«è
¼éé£éé©å¦å²³æ¥½é¡é¡æç¬ æ¨«æ©¿æ¢¶é°æ½å²åæ°æ¬æ´»æ¸æ»èè¤è½ä¸é°¹å¶æ¤æ¨ºéæ ªå
ç«è²ééåé´¨æ ¢è
è±ç²¥åè
ç¦ä¹¾ä¾å å¯ååå§å·»åå ªå§¦å®å®å¯å¹²å¹¹æ£ææ
£æ¾ææ¢ææ¡æ£ºæ¬¾ææ±æ¼¢æ¾æ½
ç°çç£ç竿管簡緩缶翰èè¦è観è«è²«ééééé¢é¥é館è丸å«å²¸å·ç©çç¼å²©ç¿«è´éé é¡é¡ä¼ä¼å±åå¨åºå¥å¬å¯å²å¸å¹¾å¿æ®æºææ¢ææ£æ£æ©å¸°æ¯
æ°æ±½ç¿ç¥å£ç¨ç´å¾½è¦è¨è²´èµ·è»è¼é£¢é¨é¬¼äºå½åå¦å®æ¯ææ¬æ¬ºç çç¥ç¾©è»èª¼è°æ¬èé ååå«æ¡æ©è©°ç §æµé»å´å®¢èèéä¸ä¹
ä»ä¼åå¸å®®å¼æ¥ææ½æ±æ±²æ³£ç¸ç究窮ç¬ç´ç³¾çµ¦æ§çå»å±
å·¨ææ ææ¸ è許è·é¸æ¼ç¦¦é亨享京ä¾ä¾ åå
競å
±å¶åå¡å¿å«å¬å¢å³¡å¼·å½æ¯æææææ©æ³ççç¯è¸è
èèé·é¡é¿é¥é©ä»°åå°ææ¥å±æ²æ¥µçæ¡ç²å
å¤åå·¾é¦æ¤æ¬£æ¬½ç´ç¦ç¦½çç·è¹èè¡¿è¥è¬¹è¿éåéä¹å¶å¥åºççç©è¦èº¯é§é§é§å
·æèå°ç©ºå¶å¯éé
串æ«é§å±å±æçªæ²é´è½¡çªªç
éç²æ ç¹°æ¡é¬å²åè«è¨ç¾¤è»é¡å¦è¢ç¥ä¿å¾åå
ååçªåå¥å½¢å¾æµæ
¶æ
§æ©æ²æºæ¬æ¯æ¡æ¸ç¦ç¨½ç³»çµç¶ç¹ç½«èèèè¨è©£è¦è»½é é¶è¸è¿é¯¨åæææ¿éæ¡åæ¬ æ±ºæ½ç©´çµè¡è¨£æ件å¹å¦å¥å
¼å¸å£å§åå
å«å»ºæ²æ¸æ³æ²æ¤æ¨©ç½ç¬ç®ç 硯絹çè©è¦è¬è³¢è»é£éµéºé¡é¨é¹¸å
åå³å¹»å¼¦æ¸æºçç¾çµè·è¨è«ºéä¹åå¤å¼åºå§å¤å·±åº«å¼§æ¸æ
æ¯æ¹çç³è¢´è¡è¡è°èèªè·¨é·é顧é¼äºäºä¼ååå¾å¨¯å¾å¾¡æ梧æªçç¢èªèª¤è·éä¹é¯äº¤ä½¼ä¾¯ååå
å
¬åå¹å¾åå£ååååå¢å¥½ååå®å·¥å·§å··å¹¸åºåºåº·å¼ææ
æææ§æ»æææ´ææ ¡æ¢æ§æ±æ´ªæµ©æ¸¯æºç²çç¡¬ç¨¿ç³ ç´
ç´çµç¶±èèè¯è±è
èèªèè¡è¡¡è¬è²¢è³¼éé
µé±ç ¿é¼é¤éé
é¦é«é´»åå«å·åå£æ·æ¿ 豪è½éº¹å
å»åå½ç©é
·éµ é»çæ¼è
°ç忽æ骨çè¾¼æ¤é ä»å°å¤å¢¾å©æ¨ææææ ¹æ¢±æ··çç´ºè®éäºä½åå嵯左差æ»æ²ç³ç è©éè£å座æ«åµå¬åæåå¡å¦»å®°å½©ææ¡æ ½æ³æ¸ç½éçç ç ¦ç¥æç´°
èè£è¼éå¤å¨æ罪財å´åéªå ºæ¦è´å²å´å¼ç¢é·ºä½ååæ¾æ¨ææµçªçç´¢é¯æ¡é®ç¬¹ååå·å¯æ¶æ®æ¦æ殺è©éçé¯æé鮫ç¿æä¸ååå±±æ¨ææ£æ¡ç¦çç£ç®çºèè®è³é
¸é¤æ¬æ«æ®ä»ä»ä¼ºä½¿åºå¸å²å£å士å§å§å§¿åå±å¸å¸«å¿æææ¯åæ¯æ½æ¨ææ¢æ»æ°ç
ç¥ç§ç³¸ç´ç´«è¢èè³è¦è©è©©è©¦èªè«®è³è³é飼æ¯äºä¼¼ä¾å
å寺æ
ææ次æ»æ²»ç¾ç½çç£ç¤ºèè³èªèè¾æ±é¹¿å¼è鴫竺軸å®é«ä¸å±å·å¤±å«å®¤æ湿æ¼ç¾è³ªå®èç¯ å²æ´è屡èç¸èåå°æ¨èµ¦æç
®ç¤¾ç´è
è¬è»é®èéªååºå°ºæç¼çµé
éé«è¥å¯å¼±æ¹ä¸»åå®ææ±æ®ç©ç 種è
«è¶£é
é¦åååªå¯¿æ樹綬éååå¨å®å°±å·ä¿®ææ¾æ´²ç§ç§çµç¹ç¿èèèè¡è¥²è®è¹´è¼¯é±é
é
¬ééä»ä½å
åå¾æææ±æ¸ç£ç¸¦ééåå¤å®¿æ·ç¥ç¸®ç²å¡¾çåºè¡è¿°ä¿å³»æ¥ç¬ç«£è駿å循æ¬æ¥¯æ®æ·³æºæ½¤ç¾ç´å·¡éµéé å¦åææææ¸åº¶ç·ç½²æ¸è¯è·è«¸å©å女åºå¾æé¤é¤å·ååå åå¬å¨åå±å奨妾娼宵å°å
°å°å°åºåºå» å½°æ¿ææææ·ææææ¶æ¾æ¢¢æ¨æ¨µæ²¼æ¶æ¸æ¹ç¼ç¦ç
§ççç¡ç¤ç¥¥ç§°ç« ç¬ç²§ç´¹èèèèè¡è£³è¨è¨¼è©è©³è±¡è³é¤é¦é¾éééä¸ä¸ä¸ä¹åå°åå ´å£å¬¢å¸¸æ
æ¾æ¡ææµç¶ç³ç©£è¸è²é¸é å±å´é£¾ææ¤æ®çç¹è·è²è§¦é£è辱尻伸信侵åå¨ å¯å¯©å¿æ
æ¯æ°æ森æ¦æµ¸æ·±ç³ç¹çç¥ç§¦ç´³è£è¯èªè¦ªè¨ºèº«è¾é²éé人ä»å塵壬å°çå°½è
è¨è¿
é£é笥è«é é
¢å³å¨éå¹å帥æ¨æ°´çç¡ç²ç¿ è¡°éé
éééçé«å´åµ©æ°æ¢è¶¨éæ®ææ¤è
é é裾æ¾æºå¯¸ä¸ç¬çæ¯åå¶å¢å§å¾æ§ææ¿æ´ææ´æ£²æ æ£æ¸
ç²ççç²¾èå£°è£½è¥¿èª èªè«ééééæç¨èé»å¸æææ¥ææç³ç©ç±ç¸¾è責赤跡è¹ç¢©åææ¥ææè¨çªç¯èª¬éªçµ¶èèä»å
åå 宣å°å°å·æ¦ææ°æ æ ´æ³æµ
æ´ææ½ç
ç
½æç©¿ç®ç·ç¹ç¾¨è
ºèè¹è¦è©®è³è·µé¸é·éééé®®åå漸ç¶å
¨ç¦
ç¹è³ç³åå¡å²¨æªæ¾æ½æ¥çççç¤ç¥ç§ç²ç´ çµè訴é»é¡é¼ å§åµåå¢ååªå£®å¥ç½å®å±¤åæ£æ³æææ¿æ»æ
æ©æ¹å·£æ§æ§½æ¼ç¥äºç©ç¸çªç³ç·ç¶è¡èèè¬è¼è»è£
èµ°ééééé¨åå¢æèèµè´é ä¿å´åå³æ¯ææ測足éä¿å±è³æç¶åè¢å
¶æåå«å°ææéä»å¤å¤ªæ±°è©å¾å 妥æ°ææèµæ¥éé§é¨¨ä½å 対è岱帯å¾
æ æ
æ´æ¿æ³°æ»èè
¿èè¢è²¸éé®éé»é¯ä»£å°å¤§ç¬¬éé¡é·¹æ»ç§ååå®
æææ沢濯ç¢è¨é¸æ¿è«¾è¸å§è¸åªå©ä½é辰奪è±å·½ç«ªè¾¿æ£è°·ç¸é±æ¨½èª°ä¸¹ååå¦æ
æ¢æ¦ææ·¡æ¹çç端箪綻è½èèèªéå£å£å¼¾æææªæ®µç·è«å¤ç¥å°å¼æ¥æºæ± ç´ç¨ç½®è´èé
馳ç¯ç竹çèé秩çªè¶å«¡çä¸ä»²å®å¿ æ½æ¼æ±æ³¨è«è¡·è¨»é
é³é§æ¨ç¦çªè§è貯ä¸å
åå寵å¸å¸³åºå¼å¼µå½«å¾´æ²ææ¢ææ½®ççºçºè´è¹è
¸è¶èª¿è«è¶
è·³éé·é é³¥å
æç´ææ²çè³é®é³æ´¥å¢æ¤æ§è¿½éçéå¡æ æ´æ§»ä½æ¼¬æè¾»è¦ç¶´é椿潰åªå£·å¬¬ç´¬çªåé£é¶´äºä½ååµåè²åå ¤å®å¸åºåºå»·å¼ææµæºæ梯æ±ç¢ç¦ç¨ç· èè¨è«¦è¹éé¸ééé¼æ³¥ææ¢æµæ»´çç¬é©é溺å²å¾¹æ¤è½è¿é
å
¸å¡«å¤©å±åºæ·»çºç貼転é¡ç¹ä¼æ®¿æ¾±ç°é»å
åå µå¡å¦¬å± å¾ææ渡ç»èè³éé½éç ¥ç ºåªåº¦å奴æåå
å¬åååå¡å¡å¥å®å³¶å¶æ¼æææ±æ¡æ¢¼æ£çæ·æ¹¯æ¶ç¯çå½ç祷çççç³çµ±å°è£è©è¤è¨è¬è±è¸éééé¶é 騰éåååå å°æ§ææ´ç³ç«¥è´èéé
å³ é´å¿å¾å¾³æ¶ç¹ç£ç¦¿ç¯¤æ¯ç¬èªæ æ©¡å¸çªæ¤´å±é³¶è«å¯
é
çå¸å±¯ææ¦æ²è±éé åæéå¥é£å
ä¹åªèè¬çæºé楢馴ç¸ç·åæ¥ è»é£æ±äºå°¼å¼è¿©åè³èè¹å»¿æ¥ä¹³å
¥å¦å°¿é®ä»»å¦å¿èªæ¿¡ç¦°ç¥¢å¯§è±ç«ç±å¹´å¿µæ»æçç²ä¹å»¼ä¹åå¢æ©æ¿ç´è½è³è¿è¾²è¦è¤å·´ææè¦æ·æ³¢æ´¾ç¶ç ´å©ç½µè馬俳å»ææææ¯ççèèºè¼©é
åå¹åªæ¢
楳ç
¤ç½è²·å£²è³ éªéè¿ç§¤ç§è©ä¼¯å¥åæææ³ç½ç®ç²è¶èè¿«ææ¼ çç¸è«é§éº¦å½ç®±ç¡²ç®¸èç櫨幡èçç å
«é¢æºçºé髪ä¼ç½°æçé¥é³©åºå¡è¤é¼ä¼´å¤åååå¸æ¬ææ¿æ°¾æ±çç¯ççç¹è¬è©è²©ç¯éç
©é 飯æ½æ©çªç¤ç£èè®åªåå¦å¦åºå½¼æ²ææ¹æ«ææ¯æ
³ç²ç®ç¢ç§ç·ç½·è¥è¢«èª¹è²»é¿éé£æ¨ç°¸å尾微ææ¯çµçç¾é¼»æç¨å¹çé«å½¦èè±èå¼¼å¿
ç¢çé¼æ¡§å§«åªç´ç¾è¬¬ä¿µå½ªæ¨æ°·æ¼ç¢ç¥¨è¡¨è©è±¹å»æç
ç§èé¨é²èèé°å彬ææµç貧è³é »æç¶ä¸ä»å 夫婦å¯å¨å¸åºææ¶æ·æ§æ®æµ®ç¶ç¬¦è
èèèè² è³¦èµ´ééä¾®æ«æ¦èè¡èªé¨å°æ¥é¢¨èºèä¼å¯å¾©å¹
æç¦è
¹è¤è¦æ·µå¼æ沸ä»ç©é®åå»å´å¢³æ¤æ®ç奮ç²ç³ç´é°æèä¸ä½µå
µå¡å¹£å¹³å¼æ並è½ééç±³é å»å£ç碧å¥ç¥èç®åå¤çç¯ç·¨è¾ºè¿é便å娩å¼éä¿èéªåææ©ç«è£è¼ç©åå¢æ
ææ®æ¯ç°¿è©å£ä¿¸å
åå ±å¥å®å³°å³¯å´©åºæ±æ§æ¾æ¹ææ³æ³¡ç¹ç ²ç¸«èè³èè¬èè¤è¨ªè±é¦é飽鳳鵬ä¹äº¡ååå妨帽å¿å¿æ¿æ´æææ£åç´¡èªè¨è¬è²è²¿é¾é²å é ¬ååå墨æ²æ´ç§ç¦ç©é¦å没æ®å å¹å¥æ¬ç¿»å¡çæ©ç£¨é麻å妹æ§ææ¯å©æ§å¹èæ鮪æ¾é±æ¡äº¦ä¿£åæ¹æ«æ²«è¿ä¾ç¹éº¿ä¸æ
¢æºæ¼«èå³æªé
å·³ç®å²¬å¯èæ¹èç¨èå¦ç²æ°ç å夢ç¡ççé§éµ¡æ¤å©
¿å¨å¥åå½æçè¿·é鳴姪çæ»
å
æ£ç¶¿ç·¬é¢éººæ¸æ¨¡èå¦åæ¯çç²ç¶²èèå²æ¨é»ç®æ¢å¿é¤
å°¤æ»ç±¾è²°åæ¶ç´éåä¹å¶å¤çºè¶éå¼¥ç¢åå½¹ç´è¬è¨³èºéæ³è®éæææ²¹çè«è¼¸å¯ä½åªåå宥幽æ ææææ湧æ¶ç¶ç·ç±ç¥è£èªéééµéèå¤äºä½ä¸èªè¼¿é åå¹¼å¦å®¹åº¸ææºæææ¥æ§æ´æº¶çç¨çª¯ç¾èèèè¦è¬¡è¸é¥é½é¤æ
¾æ欲æ²æµ´ç¿ç¿¼æ·ç¾
èºè£¸æ¥è±é ¼é·æ´çµ¡è½é
ªä¹±åµåµæ¬æ¿«èè覧å©åå±¥æ梨ççç¢è£è£¡éé¢é¸å¾çç«èæ ç¥åæµæºççç¡«ç²éç«é¾ä¾¶æ
®æ
èäºäº®å両å寮ææ¢æ¶¼çççç¨ç³§è¯è«é¼ééµé åç·å«åææ·çç³è¨è¼ªé£é±éºç å¡æ¶ç´¯é¡ä»¤ä¼¶ä¾å·å±å¶ºæç²ç¤¼èé´é·é¶ééºé½¢æ¦æ´åå£çè£å»æææ¼£ç
簾練è¯è®é£é¬åé¯æ«çè³è·¯é²å´å©å»å¼æ楼æ¦æµªæ¼ç¢ç¼ç¯èè¾èéå
éºç¦èé²è«åå話æªè³èææ é·²äºäºé°è©«èè¨æ¤æ¹¾ç¢è
";
@Override
public void start(Stage stage) throws Exception {
BorderPane pane = new BorderPane();
CheckBox padding = new CheckBox("Padding");
CheckBox wrap = new CheckBox("Wrap");
CheckBox hugeFont = new CheckBox("Huge font");
Button recreate = new Button("recreate");
HBox header = new HBox(8, wrap, hugeFont, padding, recreate);
header.setAlignment(Pos.CENTER);
pane.setTop(header);
Scene scene = new Scene(pane, 700, 300);
stage.setScene(scene);
stage.show();
padding.selectedProperty().addListener((on,oldValue,newValue)->{
((TextArea)pane.getCenter()).setPadding(new Insets(newValue.booleanValue()?20:0));
});
wrap.selectedProperty().addListener((on,oldValue,newValue)->{
((TextArea)pane.getCenter()).setWrapText(newValue.booleanValue());
});
hugeFont.selectedProperty().addListener((on,oldValue,newValue)->{
((TextArea)pane.getCenter()).setFont(Font.font(Font.getDefault().getFamily(), newValue.booleanValue()?120:12));
});
recreate.setOnAction(e->pane.setCenter(createTextArea()));
pane.setCenter(createTextArea());
}
public static void main(String[] args) {
Application.launch(args);
}
TextArea createTextArea(){
TextArea textArea = new TextArea();
StringBuilder buf = new StringBuilder();
// String testchar = alpha;
// String testchar = hiragana;
// String testchar = katakana;
// String testchar = jis_lv1;
String testchar = alpha + number + hiragana + katakana + jis_lv1;
Random r = new Random();
for(int i=0; i<TEST_TEXT_LENGTH; i++){
buf.append(testchar.charAt(Math.abs(r.nextInt())%testchar.length()));
if(i>0 && i%100 == 0){
buf.append("\n");
}
}
textArea.setFont(Font.getDefault().font(15.0));
textArea.setText(buf.toString());
return textArea;
}
}
**Next Step:**
This is a proposal for the next step, but I think it may be included in this Pull Request.
MULTIPLE_NODES mode is not as responsive as this Pull Request change for the following reasons:
* In MULTIPLE_NODES mode, the number of nodes becomes huge and the response deteriorates without virtualization.
* Implementation of MULTIPLE_NODES mode is in progress (probably giving up)
It is suggested that the existing implementation of MULTIPLE_NODES mode be discarded as it is not worth leaving at all.
-------------
Commit messages:
- 8090110: TextArea performance improvements
Changes: https://git.openjdk.java.net/jfx/pull/307/files
Webrev: https://webrevs.openjdk.java.net/?repo=jfx&pr=307&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8090110
Stats: 18 lines in 1 file changed: 17 ins; 0 del; 1 mod
Patch: https://git.openjdk.java.net/jfx/pull/307.diff
Fetch: git fetch https://git.openjdk.java.net/jfx pull/307/head:pull/307
PR: https://git.openjdk.java.net/jfx/pull/307
More information about the openjfx-dev
mailing list