سؤال

أنا عن أداء سبب ترقية C# مكتبة C++.أثناء عملية عادية هذه المكتبة الاحتياجات ، من بين أمور أخرى ، إلى تحليل حوالي 150000 الرياضيات التعبيرات (التفكير في صيغ excel) مع متوسط طول أقل من 150 حرفا.

في C# الإصدار, أنا استخدم الذهب محلل لتوليد تحليل التعليمات البرمجية.فإنه يمكن تحليل كل 150'000 التعبيرات في أقل من ثانية واحدة.

لأن كنا نفكر في تمديد لغتنا فكرت الانتقال إلى C++ قد تكون فرصة جيدة لتغيير ANTLR.لقد استدار (بسيطة) النحوي إلى ANTLR ولدت ج كود الخروج منه.تحليل 150'000 تعبيرات يأخذ أكثر من 12 ثانية ، لأن لكل التعبير ، أنا بحاجة إلى إنشاء جديد ANTL3_INPUT_STREAM رمزية تيار ، lexer و محلل - هناك على الأقل في الإصدار 3.4, لا يمكن إعادة استخدامها.

سأكون ممتنا هو شخص ما يمكن أن تعطيني توصية ما تستخدم بدلا من ذلك - الذهب هو بالطبع خيار على الرغم من توليد C++ أو C رمز يبدو أكثر تعقيدا مما C# متنوعة.بلدي النحوي هو LALR و LL(1) متوافق.الشاغل هو تحليل الأداء على مساهمات صغيرة.

هل كانت مفيدة؟

المحلول

وأود أن محاولة زيادة::روح.وغالبا ما extreamly سريع (حتى على تحليل الامور البسيطة مثل عدد صحيح يمكن أن يكون أسرع من ج الدالة atoi http://alexott.blogspot.com/2010/01/boostspirit2-vs-atoi.html)

http://boost-spirit.com/home/

وقد أشياء لطيفة :رأس فقط ، لذلك التبعية الجحيم الليبرالية الترخيص.

ومع ذلك حذر من أن منحنى التعلم هو أمر صعب.انها حديثة C++ (أي مؤشر ، ولكن الكثير من القالب و محبط للغاية تجميع الأخطاء), حتى يأتي من ج أو C#, قد لا تكون مريحة جدا.

نصائح أخرى

إذا النحوي أن يكون تحليل بسيط قد يكتب محلل باليد.

معظم محلل المولدات مصممة لجعل من السهل اثارة العامل اللغوي, و وقت التنفيذ غالبا ما يعاني نتيجة لذلك.

أفضل أداء رأيته في تحليل جاء من دفعة.روح.تشى التي تعبر عن قواعد اللغة في C++ باستخدام ميتا-برمجة القالب.ليس لضعاف القلب على الرغم من.

وهذا سوف تحتاج إلى أن تكون معزولة جيدا و تجميع الوقت من الملف الذي يحتوي على محلل الزيادة إلى عدة ثوان (لذا من الأفضل التأكد من أن هناك عدد قليل قدر ممكن من هناك).

إذا كان جملة من التعبير الخاص بك هو بسيط بما فيه الكفاية ، والنظر في مما يجعل الخطي العودية النسب محلل.فإنه يمكن تشغيل سريع جدا و تعطيك القدرة (مع ما يكفي من الرعاية) إلى تقرير لطيف و تحديدا أخطاء في بناء الجملة.

هل يمكن أيضا استخدام البيسون, ولكن أعتقد الخطي العودية محلل سيكون أسرع.

ويمكنك أن تفعل lexing مع فليكس ولدت lexer و لا تحليل يدويا في العودية أصل الطريق.

لمعلوماتك دول مجلس التعاون الخليجي مترجم الخاصة العودية-أصل موزعي C++ & C على الأقل.لا يستخدم محلل مولدات (مثل البيسون أو ANTLR) بعد الآن.

بدلا من expr تجعلك النحوي الاعتراف sequence-of-expr.

تحرير:

بدلا من الاضطرار (البيسون الجملة):

start: expr { process_expr ($1); }
     ;

يكون:

start: expr_seq ;

expr_seq:   expr          { process_expr ($1); }
          | expr_seq expr { process_expr ($2); }
          ;

لقد كتبت العديد من موزعي و اليد ترميز العودية-النسب هي الطريقة التي كنت تفعل ذلك.فهي سهلة الكتابة و تقريبا الأمثل.

وقال إن السرعة هو ما كنت بعد ، بغض النظر عن ما تكتب سوف يكون هناك الكثير من الغرفة بسرعة.هذه سوف تكون في الطرق التي يمكن أن مفاجأة لك ، لأن أي شيء لك يمكن أن أعتقد, كنت قد فعلت بالفعل.

هنا مجموعة الشرائح والتي تبين كيفية القيام بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top