עד כמה PHP 8 תעזור למהירות האתר – המשמעות של JIT Compiler

PHP 8 מוכנה ואיתה שלל שיפורים. בפוסט הזה נתמקד ביכולת הכי גדולה שהוכנסה לגרסה והיא - JIT Compiler. מה זה ועד כמה זה יעזור למהירות האתר שלנו.
PHP 8 JIT Compiler

תוכן עניינים

גרסה 8 של PHP כבר יצאה ואפשר לשחק איתה. בין שאר השיפורים הנחמדים מאוד שעליהם תוכלו לקרוא במה חדש ב PHP 8 בולטת יכולת חדשה אחת והיא ההוספה של JIT לשפה.

מדובר במשהו שהוא מעבר ל syntax נוח יותר או דברים כמו attributes או union types שהם טובים מאוד לכשעצמם אבל הם לא אבן דרך בסדר גודל של פיתוח JIT שלוקח כמה שנים לעשות דבר כזה כמו שצריך.

מה זה JIT Compiler

JIT זה ראשי תיבות של Just In Time. אם נתרגם מילולית לעברית – "בדיוק בזמן". כלומר קומפיילר שעובד בדיוק בזמן. זה לא נשמע הכי טוב בעברית אבל במילים פשוטות הכוונה לקומפיילר שמקמפל קוד בזמן ריצה.

כדי להריץ קוד על מכונה (מחשב לדוגמא) הקוד צריך להיות בשפה שהמחשב מבין מה שנקרא native code או machine code. בגלל שרובנו כותבים בשפה עילית, הקוד שלנו צריך לעבור טרנספורמציה לשפת מכונה לפני ההרצה. לכך יש כמה אפשרויות:

  • AOT – לפני הרצת התוכנית, ניצור קוד שהוא כבר native code. בזמן ריצה לא נצטרך לבצע עוד שום פעולת הידור והקוד כבר מובן להרצה.
  • Interpreter – הקוד שלנו ישאר כטקסט או יתורגם ל bytecode ובזמן ריצה יהיה מנוע שאחראי לקחת את ה bytecode \ instructions \ opcodes ולהריץ אותם כ native code. בכל פעם שהקוד יצטרך לרוץ, ה interpreter יצטרך לתרגם את ה bytecode ולהריץ אותם.
  • JIT – זה משהו בין שני הסעיפים הקודמים. מצד אחד אין כאן קמפול מראש. הקוד עדיין קיים כ bytecode אבל בזמן ריצה אותו bytecode יתורגם ל native code פעם אחת בלבד ומאז הוא יישמר כך. בפעם הבאה שהקוד ירוץ לא נצטרך לבצע עוד שום פעולת הידור.

עד ל PHP 8 הרצה של קוד עבדה כך

  • סקריפט PHP מפורסר ומקומפל ל Opcodes שהם הוראות (instructions) לביצוע.
  • מכונה וירטואלית או מנוע שנקרא Zend שמבין את ה instructions מריץ אותן עד לסיום הסקריפט. הוא מבצע את הפעולה נקראת interpreter. (יש מימושים נוספים למכונה וירטואלית מלבד Zend כמו HVVM אבל זה רק לצורך הדוגמה).

מה שונה interpreter מ JIT

לכאורה שניהם עובדים בזמן ריצה והם מקבלים קוד שהוא לא native ומאפשרים לו לרוץ על המחשב.
ההבדל הוא, ש interpreter מקבל תמיד את ה opcodes וצריך לפרש אותם כל פעם מחדש ולהריץ אותם אחד אחרי השני ואילו ה JIT מקמפל אותם פעם אחת ל native code ואז לא יצטרך יותר לפרש את אותן instructions אלא מעכשיו זה כבר ישאר ב native code ופעם הבאה שהקוד הזה יקרא, הוא ירוץ כ native.

מה הבעיה באיך ש interpreter עובד מבחינת מהירות?

בכל פעם שנרצה להריץ סקירפט, נצטרך קודם לקמפל אותו ל opcodes ואז Zend יוכל להריץ אותו. זהו שלב שנוכל לחסוך אם היינו יכולים לשמור את אותם opcodes. ובדיוק בשביל זה יש מה שנקרא Opcode Cache.

בעזרת Opcode Cache, הסקריפט יקומפל פעם אחת בלבד ומאז אותן opcodes ישמרו ובפעם הבאה הקוד הזה יצטרך לרוץ, השלב של הפרסור והקמפול ל opcodes יחסך. דבר זה ללא ספק משפר את הביצועים בהרבה. אבל זה קיים כבר מגרסה 5.5 של PHP.

PHP 8 JIT Compiler

מגרסה 8 תהיה לנו את האפשרות להשתמש ב JIT מה שיתן שלב נוסף של אופטימיזציה מעבר ל Opcode Cache. במקום לשמור רק את ה Opcode ולחסוך שלב אחד של הקמפול, נחסוך לגמרי את העולה של ה interpreter בזמן ריצה על ידי זה שהקוד יתורגם ל native code פעם אחת ומאז ירוץ ככזה בכל פעם שהקוד תקרא.

עד כמה נרגיש את שיפור המהירות עם JIT

לכאורה זה נשמע מבטיח מאוד ונוכל לצפות לשיפור משמעותי במהירות. אבל זה תלוי.

אם יש לנו קוד שעושה חישובים כבדים שדורשים כוח עיבוד גדול כמו עיבוד וידאו/תמונה מתקדם, אובייקטי תלת מימד, AI, AR, אז נרגיש שיפור גדול מאוד כי הקוד דורש כוח עיבוד נטו והוא יהיה מוכן להרצה אחרי הפעם הראשונה שהוא יקרא (חוץ מהיתרון הברור בחיסכון בהידור של הקוד יש כאן עוד הרבה מקום לאופטימזציות מעבד שיקרו בגלל שהקוד הוא כבר קוד מכונה שמוכן להרצה).

אבל אם מדובר באתר סטנדרטי שהפעולות הכבדות והבזבזניות שקורות בו הן לא כוח מעבד אלא קריאות HTTP, שאילות SQL וקריאת קבצים, אז השיפור האדיר בהרצת הקוד לא באמת יורגש.

יש דוגמה יפה ביוטיוב שאני ממליץ לכם לראות שמשווה את ההבדל בביצועים בין PHP 7 ל PHP עם JIT במקרה של fractal generator. מדובר פה ב POC של JIT ולא במה שיצא עם PHP 8 אבל הרעיון הוא זהה.

תראו שבדוגמה בגלל אופי הקוד שרץ ההבדל הוא מטורף! אבל בהקשר שלא רוב האתרים שלנו ההפרש יהיה כנראה מזערי ובטח לא דומה להפרש העצום בין PHP 5.6 ל PHP 7. (אם אתם עדיין מריצים את האתר שלכם עם גרסה 5, תעשו לעצמכם טובה ותשדרגו דחוף ל 7! זה אחד הדברים הראשונים שעליכם לעשות בהקשר של שיפור מהירות האתר).

סיכום

ההוספה של JIT ל PHP היא בהחלט אבן דרך משמעותית לשיפור הביצועים של השפה. זה יתבטא בעיקר בזה שמעתה ספריות שהיו חייבות להיכתב בשפות אחרות שהן משתמשות ב AOT או JIT, יוכלו להיכתב גם ב PHP מה שפותח אפשרויות חדשות למתכנתי PHP.

בפועל בתארים, לפחות ברובם השיפור לא יהיה גדול מדי אם כי יהיה קיים. כמובן ש PHP 8 לא מסתכמת רק ב JIT ויש דברים נוספים חשובים, וכמו תמיד ברגע שכל בעיות התאימות של וורדפרס והתוספים יפתרו, מומלץ מאוד לעדכן!

תוכן עניינים

אם יש לכם שאלות על הפוסט או רוצים להעיר משהו, השאירו תגובה ואענה בהקדם.

הרשמה
Notify of
0 תגובות
Inline Feedbacks
הצג את כל התגובות

גם הפוסטים הבאים יעניינו אותך

0
אשמח לשמוע את דעתכם, מוזמנים להשאיר תגובהx