הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
מאמרים בנושא תכנה ומחשבים.
כשהקצאות הזיכרון משנות
יש הרבה צווארי בקבוק ביישומי רשת. רבים מהם נובעים מארכיטקטורת היישום, קריאות מערכת הפעלה ועוד.
אבל בשלב מסוים יישום רשת יעיל מגיע לנקודה בה הקצאות זיכרון מתחילות להשפיע בצורה משמעותית, בפרט זה נוגע לכל הקשור לעבודה עם מחרוזות.
ב־C++ יש מחרוזת הטובה הישנה: std::string
. אבל יש לה מגבלה אחת: היא דורשת הקצאה
של חתיכת זיכרון. זה נכון לכל מחרוזות בכל השפות ובכל הכלים גם אם הם immutable ומשתמשות ב-reference counting - עדין יש צורך להקצות זיכרון לאותה החתיכה.
בואו ניקח לדוגמה יישום פשוט שמאתר מקום כלשהו בעץ המשתמש במפתחות std::string
המבוסס על std::map
. הוא מקבל כפרמטר מחרוזת כמו /foo/bar/124
ומחלץ ממנה
את המפתחות foo
ו־bar
כחלקים במסלול, יישום בסגנון xpath.
אז עבור פונקציה:
void find_path(std::string const &str);
הקריאה
find_path("/foo/bar/123");
תצטרך ליצור שלוש מחרוזות:
-
/foo/bar/123
foo
bar
כך או אחרת עבור שולש מחרוזות האלה נצטרך להקצות שלוש חתיכות זיכרון, גם אם המחרוזות שלנו משתמשות ב-reference counting או הן immutable.
אז כיצד CppCMS מתמודד עם הבעיה הזו:
קיימת מחלקה מיוחדת
cppcms::string_key
שמחזיקה מתוכה את ה־std::string
הישן והטוב. אבל בנוסף, ניתן ליצור את אותה המחלקה באופן מפורש מזוג מצביעים מטיפוס char const *, כך שהיא שומרת רק הצבעה לטקסט ולא מעתיקה אותו.כמובן, שבמקרה הזה, המשתמש הוא האחראי לכך שהמצביעים יישארו תקפים כל עוד משתמשים באובייקט הזה.
עכשיו נשנה את הפונקציה
find_path
קלות ונוסיף לה עוד גרסה:void find_path(char const *str); void find_path(std::string const &str);
עכשיו, נשתמש רק במחרוזות שלא "מחזיקות בעלות על התוכן" ובכך נוכל ליצור מחרוזת מקורית ותת־מחרוזות foo ו־bar בלי להקצות זיכרון בכלל.
כמובן, זה הקו הכללי, אבל יש עוד הרבה טריקים מעניינים נוספים שמאפשרים למנוע או להוריד את כמות ההקצאות זיכרון כמו שימוש ב־pool שמוקצה פעם אחת ומשוחרר בסוף בבת אחת, שימוש במחסנית עבור קטעים קטנים ועוד.
CppCMS החל מגרסה 0.99.9 ששוחררה היום, אימץ את הטכניקה הזו בצורה רחבה ואפשר, במקרים מסוימים, להכפיל את ביצועים המערכת כולה.
כמובן, כשמשתמשים בטריקים האלה צריך להיות זהיר במיוחד גבי ניהול זיכרון ידני. אלא אם, קטע קוד רץ הרבה פעמים או כבר זיהיתם קטע מסוים כצוואר בקבוק, תשתמשו במחרוזת הרגילה. בסופו של דבר, הקצאה של זיכרון היום זה תהליך יחסית מהיר, אם לא מנצלים אותו לרעה.
שוחררה גרסת Boost.Locale חדשה
אחרי עבודה ארוכה על שיפורי ממשק ותיקוני בעיות שהועלו בתהליך בחינה רשמית של Boost.Locale הגרסה החדשה 4.0.0 שוחררה.
בקרוב אתחיל לשלב אותה בעץ svn של Boost, כך שאם הכל ילך בסדר, אני צופה שהיא תיכנס לגרסה 1.48 או לכל המאוחר 1.49 של Boost.
כרגיל:
- הורדה:
http://sourceforge.net/projects/cppcms/files/cppcms/ - תיעוד ומדריכים:
http://cppcms.sourceforge.net/boost_locale/html/index.html
במקביל שוחררה גרסת CppCMS 0.99.8 שמכילה את כל השינויים של Boost.Locale וגם תיקוני באגים שהצטברו במהלך 3 חודשים אחרונים.
אם עדיין לא שמתם לב, אני נותן הרצאה על Boost.Locale באוגוסט פינגווין - תבואו יהיה מעניין (גם אם אתם לא מדברים ב־C++)
הבלוג שודרג לגרסה חדשה
שלום לכולם,
הבלוג שודרג לגרסה חדשה שעובדת עם הגרסה האחרונה של CppCMS.
למעשה מערכת הבלוג שוכתבה מחדש, כיוון הבלוג הזה הוא היישום הראשון שמימשתי בעזרת CppCMS הוא סחב אחרי הרבה קוד מיושן וגרוע. שכתבתי את המערכת מחדש כך שהוא הפך הרבה יותר מאובטח ונקי מבחינת הקוד.
אחרי שהוא ירוץ זמן מה ברשת, אני אשחרר גרסה רשמית שלו.
אנא שימו לב לבעיות.
רוצים לנסות בבית?
כרגע אם מישהו רוצה לנסות אותו יצטרך:
- CMake 2.6 או יותר
- CppCMS 0.99.7 או גרסה חדשה יותר
- CppDB
- ספריית Discount Markdown
- ספריית ImageMagick++ או GraphicsMagick++.
את הקוד ניתן לקחת מ־svn בכתובת:
https://cppcms.svn.sourceforge.net/svnroot/cppcms/blog/trunk
אחרי שהתקנתם את כל התלויות ומשכתם גרסת svn של הבלוג:
mkdir build
cd build
cmake ..
make
לאחר מכן, צרו, בסיס נתונים של MySQL, PostgreSQL או של Sqlite3 בעזרת התסריטים הנמצאים בתת תיקיה sql. ערכו את קובץ config.js כדי להגדיר את בסיס הנתונים בו אתם הולכים להשתמש ואז הריצו:
./blog -c ../config.js
הגישה הראשונה אתם תתבקשו להזין את ההגדרות הבסיסיות של הבלוג, שם משתמש וססמה אתה תעבדו.
בלוג בא בשתי שפות - אנגלית ועברית ומכיל שתי תבניות OrangeSky ו־Contendend לבחירתכם.
שימו לב: מדובר בגרסת בטא ראשונה, כך שאם היא תהרוס לכם את השרת או תאכל לכם את החתול... ראו הוזהרתם.
גם Tatoeba תשתמש ב־CppCMS
טטואבה, פרויקט בינלאומי המהווה מעין מילון האוסף מספר רב של משפטים, מפתח גרסה חדשה ב־C++ שמבוססת על CppCMS.
למעשה ידעתי על התכנון הזה כבר מזמן, אבל לא ממש עקבתי אחרי הפרויקט. בעקבות החדשות שכתבתי עליהם בפוסט הקודם, החלטתי להסתכל שוב על הפרויקט הזה וגיליתי שהם התקדמו יפה מאוד.
גרסת האלפה (עדיין מאוד בסיסית) כבר עלתה לרשת וזמינה בכתובת: http://tato.sysko.fr. הגרסה הזו מחליפה את מנוע החיפוש הנוכחי העובד עם MySQL בבסיס נתונים ייחודי שהם פיתחו ותשתית הרשת שכתובה בעזרת CakePHP מתחלפת באחרת המבוססת על CppCMS.
בהודעה הזו הם מסבירים את ההחלטה שלהם לבחור ב־CppCMS. להחלטה הזו היה מספר לא מבוטל של סיבות.
בקיצור... תתחילו לקחת את CppCMS בצורה רצינית :-)
CppCMS אי שם בענן
אחת הבעיות הגדולות בצבירת משתמשים פוטנציאליים של CppCMS היא בעצם למצוא משתמשים קיימים מוכרים. שזהוי כמובן בעית הביצה והתרנגלות המוכרת.
על־אף של־CppCMS יש רשימת תפוצה פעילה וידוע לי על לפחות מספר חברות שמשתמשות ב־CppCMS במוצרי embedded שלהם, עדיין רוב המשתמשים לא ממהרים לפרסם את עצמם כמשתמשים גאים של שהתשתית המיוחדת הזו.
היום בחיפוש פשוט בגוגל על "x-powered-by: cppcms" גיליתי את חברת הזנק הבאה: http://dhiti.com.
הופתעתי לגלות שהיא מפעילה מספר "שירותים בענן" המשתמשים ב־CppCMS, ביניהם: http://dive.dhiti.com, http://drilll.com, http://intweetion.com.
אלה למעשה שירותים שמבוססים על RESTful API שצד הלקוח (הדפדפן) מתקשר אתם.
אחרי שהסתכלתי באתר החברה, נזכרתי שפעם קיבלתי מהם דיווח באג ותיקנתי אותו. אבל לאחר מכן, לא ממש עקבתי אחרי ההתפתחות שלהם... עד היום כשגיליתי שירותים X-Powered-By: CppCMS
.
אני שמח סוף־סוף לראות CppCMS במקום שלו הוא מיועד. אני מאוד מקווה שהפעם יתאפשר לי לספר על הפרויקט הזה באוגוסט פינגווין הקרוב.