@pcinfogmach כתב בשאלה | סקר: הצגת PDF באוצריא: שימוש בחבילת PDF מובנית או בweb_viewer?:
@י.-פל. כתב בשאלה | סקר: הצגת PDF באוצריא: שימוש בחבילת PDF מובנית או בweb_viewer?:
הסיבה שזית מהירה כ"כ, כי היא עובדת עם קובץ DB ולא עם קבצי TXT/JSON
כאן מבואר עוד סיבה
https://mitmachim.top/post/1053278
אם הולכים לטעון את כל הספר, לדעתי זה יהיה יותר איטי דרך ה-DB ממה שיש עכשיו. יש שני יתרונות עיקריים לשימוש ב-DB:
יתרון ראשון: DB מאפשר לטעון שורות ספציפיות בלי לקרוא את כל הספר מההתחלה. אבל אם ממילא טוענים את כל הספר, אז לטעון אותו יהיה יותר מהיר ב-JSON מאשר ב-DB.
יתרון שני: ביצועים טובים יותר באוצריא בנושא הקישורים. כרגע אוצריא חייבת לקרוא את כל הספר רק כדי למצוא את השורות הרלוונטיות, ולדעתי אין שום צורך בזה. כאן אכן יהיו ביצועים הרבה יותר טובים.
אבל המהירות שיש לי בזית זה לא רק זה. אני לא יודע אם יש צורך להרחיב, אבל בקיצור נמרץ:
כשמקמפלים תוכנה, כל פונקציה שמורה בטבלה. כל פעם שקוראים לפונקציה וורטאלית, התוכנה בודקת מה הקוד בטבלה הזאת. אחד ההבדלים העיקריים בין תוכנה שפועלת ב-AOT (כמו Flutter או אפילו Native באנדרואיד) לבין JIT הוא: גם אם נקרא לפונקציה וירטואלית 1000 פעמים, תוכנת AOT תלך לבדוק בטבלה הזאת אלף פעמים. אם היא תקרא אלף פעמים לפונקציה בשורה הראשונה ובשורה ה-2000, התוכנה תעשה את זה בצורה פשוטה כל פעם מחדש. (זה לא בדיוק נכון מה שאני אומר, אז אל תקפצו עליי - זה רק כדי להמחיש את הרעיון, ויש עוד הרבה הרבה אופטימיזציות שהjvm עושה, למשל אם תנאי הוא 99% נכון, ועוד, זה נושא מאוד מעניין)
זית היא תוכנת דסקטופ שפועלת במכונה וירטואלית - ה-JVM. המכונה הזאת עושה הרבה מאוד דברים כדי שהתוכנה תהיה יותר מהירה:
קומפילציה ראשונית (C1): ה-JVM מקמפלת את ה-Bytecode לקוד תואם למעבד של המחשב. זה מה שאתם רואים כשיש את מסך ההמתנה של זית - הזמן הזה הוא קומפילציה ראשונית של ה-Bytecode. זו לא קומפילציה שלמה כמו ב-JS, כי אני כבר מקמפל את קוד Kotlin ל-Bytecode. זו קומפילציה סופית: כבר קימפלתי את קוד Kotlin ו-Java ל-Bytecode שהוא דומה ל-ASM, רק בלי תאימות ייעודית למעבד מסוים. ה-JVM תקמפל את כל הקוד למשהו תואם למעבד הספציפי.
שימוש בהוראות מודרניות: רק כאן מתחיל להיות הבדל בין AOT (כמו Flutter) לבין JIT של Java. למשל, המעבדים המודרניים תומכים ב-AVX2 (הוראות מיוחדות מודרניות), אבל רוב התוכנות לא משתמשות בהן לשם תאימות. ה-JVM כן משתמשת.
מה שאני אומר אולי נשמע כמו שטויות או הגזמה, אבל Chrome לא משתמש ב-AVX2. למשל, אם תסתכלו בפורק הזה של Chrome שהוא יותר מהיר - זה גם בגלל שהוא מקמפל עם AVX2. אבל זה יוצר שני בינארים בשביל תאימות (אחד עם ואחד בלי), מה שמאוד מבלבל למשתמשים.
פרופיילינג וקומפילציה משופרת (C2): אחרי שהתוכנה רצה, ה-JVM מתחילה לעשות Profiling - כלומר מזהה אילו חלקים של הקוד הולכים ביחד, אילו חלקים רצים הרבה פעמים, ומתחילה לעשות קומפילציה שנייה שנקראת C2. לכן היא תקשר אוטומטית בין החלק שמציג את תוכן הספר לבין הרכיב שמציג את המפרשים (אם אכן מציגים את המפרשים). אחרי התהליך הזה, אומרים שהjvm התחממה.
ולפי איך שתמתמשו בתוכנה, הjim תמשיך לשפך את הc2 לפי השימוש הראילי שלכם, דבר שלעולם לא נוכל לעשות עם aot.
ולכן אם נסכם, החסרונות שזה לוקח יותר זמן להפעלה הראשונה (בערך 0.5 שנייה על מחשב מודרני אבל יכול להיות 3-4 שנייות על מחשבים קצת ישנים), שימוש יותר גבוהה בראם בלי לעשות כלום (המכונה ווירטואלית לוקחת בערך 150 מ״ב בראם) אבל מצד שני מקבלים אחרי c2 תוכנה שהיא מהירה כמעט או לפעמים אפילו יותר מאשר אם היינו כותבים אותה בcpp
[כל זה לומר, שיהיה קשה מאוד מאוד עם aot להגיע לזה.