איזו שפה יותר מהירה ?

GLev

New member
איזו שפה יותר מהירה ?

שלום, אני צריך לממש אלגוריתם מסויים, כאשר המהירות מאוד חשובה לי, אז רציתי לשאול, האם יש הבדל משמעותי בין C, C++ לבין C#, ושאלה נוספת, האם יש אפשרות לשלב קוד אסמבלי ב C# כמו ב C, C++...
 
../images/Emo41.gifאל תתפוס אותי במילה לגבי האסמבלי

אבל נראה לי שאי אפשר (למרות שאתה תמיד יכול לכתוב את הקוד ולקמפל אותו לDLL חיצוני ולקרוא לפונקציות מתוכו כמו לכל unmanaged code). אופצייה נוספת היא לכתוב את הקטעים הקריטיים מבחינת מהירות בIL שהיא שפת האסמבלי של הדוט נט. אבל אם אתה באמת צריכה משהו שיעבוד ממש ממש מהר (ברמת הmili seconds הבודדים או micro seconds מראש אל תתקרב לדוט נט כי: א. הוא רץ רק על windows שהיא במוצהר אינה מערכת המתאימה לhard real time ב. הוא לא מיועד לדברים כאלה. CPP עם קומפיילר טוב יתן לך קוד קרוב מאד לC מבחינת יעילות כל עוד אתה יודע ממש ממש טוב מה אתה עושה. הכי טוב זה שתכתוב ב-C ותשלב אסמבלר. זו דעתי בלבד. נא לא לצלוב בין 2-4.
 

vinney

Well-known member
לא לשלב אסמבלר

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

DadleFish

New member
תשובות

C מהירה יותר מ-++C ברמה מאוד, מאוד זניחה, אם אתה יודע מה אתה עושה. #C היא עולם אחר לגמרי, איטי וכבד, שמפקיע ממך את השליטה בתוכנה. #C ו-JAVA שתיהן שפות שמאוד קל ומהיר לתכנת בהן, אבל אתה משלם בביצועים ובשליטה. זה ה-TRADEOFF. לגבי אסמבלי - אי אפשר לכתוב אסמבלי ישירות בתוך #C, אבל אפשר מתוך #C להפעיל מה שנקרא unmanaged code - או במילים שלי, קוד נורמלי - למשל DLL שנכתב ב-C. בצורה כזו תוכל להפעיל אסמבלי. זה נכון אגב גם לגבי JAVA, בעזרת JNI (שזה Java Native Interface). לא מומלץ לעשות את זה, גם כי כנראה שאין לך סיבה אמיתית לעשות זאת, וגם בגלל שזה מייד משמיד כל סיכוי לפורטביליות.
 
על המשפט הראשון יש לי ציטטה

של סטראוסטראפ: "כל תכנית C בספר של K&R היא גם תכנית ++C" שוב, הקומפיילרים של C הרבה יותר בשלים. אין משהו בשפה שעושה אותה איטית יותר.
 

galh

New member
זה לא מדוייק.

אני לא מכיר בע"פ את כל התוכניות שבספר, אבל מספיק תוכנית אחת שתשתמש במילה שמורה של ++C כמו new בשביל שהטענה לא תהיה נכונה. למרות שמה שאני זוכר הם מעדיפים לקרוא למשתנים nl או buf.
ב- ++C יש כמה וכמה דברים שעושים אותה יותר איטית. אפילו סטראוסטראפ טען את זה (מדובר על כ- 5% פלוס מינוס). דברים כמו virtual tables, או copy constructors או יצירת אובייקטים באופן נסתר מוסיפים קוד לתוכנית שלך מה שהופך אותה ליותר "כבדה". תנסה להשוות בין תוכנית שכותבת למסך "hello world\n" מיליון פעמים. ב- C עם printf וב- ++C עם cout.
 
זה בדוק. כל תכנית שם היא גם ++C

הסיבה פשוטה. כשכתבו את הספר עדיין לא היו קומפיילרים ANSI ןהדרך היחידה לבדוק את תקינות הקוד היתה להריץ עם הקומפיילר של ++C ולוודא. לשאר הטענות - נסה לממש vtable ב-C ותשלפ יותר, נסה לכתוב קוד C שמעתיק struct גדול ותשלם בדיוק כמו copy ctor. הכלל הוא "אתה לא משלם על מה שאינך משתמש". נכון שקומפיילרים עדיין לא הגיעו לבשלות כמו אלה של C אבל זו שאלה של זמן. לגבי הדוגמא עם printf היא לא נכונה בעליל. משלוש סיבות: א. אני יכול להשתמש בפונקציה הזאת גם מ ++C ב. זה לא שפה אלא ספריה ג. מבחינה תיאורטים (אבל לא מעשית) ה-I/O של ++C צריך להיות מהיר יותר כי אין צורך לעשות parse על הפורמט ויש קריאה ישירה לפונקציה שמטפלת ב type המתאים. נכון שבמימושים של הספריה הסטנדרטית עדיין לא הגיעו לזה אבל הפוטנציאל קיים.
 

butthead

New member
C++ לאט מ C מסיבה אחת חשובה

Exceptions גם אם אתה לא משתמש בהם, הקומפילר צריך להפיק קוד שתומך בהם, ולצורך זה יש הרבה קוד שנועד בשביל לעקוב אחרי ריצת התוכנית למקרא שייזרק אקספצון כדי שיהיה אפשר לטפל בזה. אם תקח תוכנית ב C ותקמפל אותו בקומפילר C++ אז אפשר לצפות למשהו כמו 2% עד 10% האטה וגם הקוד יהיה הרבה יותר גדול. החדשות הטובות הם שרוב הקומפיילרים של C++ מאפשרים לכבות תמיכה של אקספצונים וכך לא משלמים את המחיר. אבל הקטע זה שאז זה לא באמת C++ אלה שפה מוזרה שדומה לC++ (אם אין אקספצונס אז זה לא C++)
 

melatonin

New member
חבל להרוס שפה

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

תדליק exceptions או תכבה וגודל התכנית יושפע (גודל קבוע) אבל היום קומפיילרים טובים לא סובלים משום חסרון בביצועים. כתוב לעצמך בנצ'מרק ותראה. (או שתחפש ברשת).
 

DadleFish

New member
אם אין exceptions אז זה לא ++C????

ואם במקרה לא השתמשת ב-templates, אז זה לא ++C? ואם לא השתמשתי ב-STL, אז זה לא ++C? ואם לא השתמשתי ב-RTTI אז זה לא ++C? שנית, במקום שאני אענה לך - כי אתה פשוט טועה - תקרא את הספר ++efficient C.
 

galh

New member
מי בדק?

לא הבנתי את הטענה שלך לגבי הקומפיילר. ++C קיבל תקן ANSI הרבה אחרי C. אז מה הקשר לבדיקת תקינות הקוד? אתה לא הבנת את הכוונה שלי. לא אמרתי שצריך לממש VTABLE ב- C או משהו דומה. העניין הוא ש- ++C מביאה לך המון דברים נלווים. מתכנת ממוצע לא מודע להשלכות האלו על דרישות זכרון והשפעה על ביצועים. ב- C אין לך את זה. א. לכל קומפיילר יש את הספריה הנלוות שלו, אז אתה לא אמור להשתמש ב- FILE או ב- printf. התאימות אחורה ל- C נתנה ל- ++C המון יתרון בהשתלטות כשפה דומינטית, אבל זה גם גרם לכך שיש לך הרבה מתכנתי ++C/C (במובן השלילי) שכותבים קוד הזוי לחלוטין. ב. זו הספרייה הסטנדטית כל קומפיילר מחוייב לספק אותה, אחרת הוא לא עומד בתקן. ג. אתה מכיר את הבדיחה של "בפוטנציאל יש לנו 2 מיליון דולר. תכל'ס יש לנו שתי שרמוטות בבית"?.
 
מחברי הספר K&R

הם בדקו את הקוד עם קומפיילר ++C שהיה הכי קרוב לתקן ANSI-C כל מה שאתה אומר טוב ויפה. אבל זה לא שפה זה סיגנון תכנות. אני יכול להשתמש בסיגנון פרוצדורלי גם ב++C (עם עוד כמה פינוקים ש ++C נותנת) האם אתה אומר שזאת לא תכנית ++C? זו כן והיא תרוץ מהר בדיוק כמו תכנית C מקבילה. שימוש בספריות C בקוד ++C איננו הזוי. סתם ככה, המימוש של IOSTREAM ב ++VC הוא ע"י STDIO והנה לך דוגמא אחת. יש דוגמאות למכביר לשימוש בקוד של Win API. האם גם זה שימוש הזוי? סיגנון תכנות פרוצדורלי רחוק מלהיות הזוי. לדוגמא ספריית האלגוריתמים בספריה הסטנדרטית. הממשק שלה פרוצדורלי לחלוטין (לא משנה שאלה הן template functions ( זה עדיין פרוצדורלי. כשפה ++C מאפשרת לך לבחור במספר סיגנונות תכנות. כל סיגנון ויתרונותיו / חסרונותיו. אחד החסרונות של סגנון יכול להיות אובדן קטן בביצועים. אבל זו לא השפה, זה סיגנון התכנות. אל תשכח שאחד האיפיונים של ++C הוא better C
 

galh

New member
יש לך סימוכין לטענות שלך?

מתוך הספר (The C Programming Language (second edition:
We used Bjarne Strousstrup's C++ translator extensively for local testing of our programs, and Dava Kristol provided us and an ANSI C compiler for final testing.​
או במילים אחרות, שום קומפלייר ++C "הכי קרוב לתקן..." (מה שמו, דרך אגב?). כרגיל, הדיון הזה גולש לטענות מטופשות. בסופו של דבר ++C מוסיפה overhead לקוד שלך, כמו ש- C מוסיפה (מעט מאוד) overhead יחסית לקוד באסמבלר. מתכנת טוב ינצל את היכולות המשופרות של ++C בשביל לכתוב קוד ברור ויעיל. לעומתו מתכנת ממוצע ומטה ינצל את היכולת ליפול בכל מלכודת ש- ++C מציבה לך בשביל לכתוב תוכניות שסוחבות רק בזכות מעבד חזק.
 

DadleFish

New member
ההבדל בין C לבין ++C מבחינת ביצועים

הוא זניח לחלוטין. גם אותך אני מפנה לקרוא את ++Efficient C. ספר מצוין.
 

galh

New member
כבר קראתי. ../images/Emo132.gif

גם הם מציינים את העובדה שיותר קל לכתוב קוד "איטי" ב- ++C. קח את הדוגמא הראשונה של ה- LOG ותראה את ההבדל בין המימוש הראשוני לאחרון. באחד מהראיונות עם סטרוסטרופ הוא טען להבדל של כ- 5% (בתכנון). ואל תתחיל להתווכח איתי, כי אנחנו מסכימים.
 
שפה שרצה על מחשב על

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