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:19 UTC 2020
On Wed, 23 Sep 2020 15:41:43 GMT, yosbits <github.com+7517141+yososs at openjdk.org> wrote:
> * 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.
@kevinrushforth
I don't know how to avoid the jcheck error, but what can I do?
yosbits is Naohiro Yoshimoto.
-------------
PR: https://git.openjdk.java.net/jfx/pull/307
More information about the openjfx-dev
mailing list