سؤال

وأنا على نطاق واسع باستخدام هياكل البيانات خريطة التجزئة في برنامجي. أنا باستخدام تنفيذ خريطة التجزئة باري كيلي نشر على المنتديات Codegear. يستخدم هذا التنفيذ داخليا وظيفة CompareText RTL ل. التنميط جعلني أدرك أن هناك الكثير من الوقت وقضى في وظيفة SysUtils إلى ما CompareText.

وكان لي نظرة على

الموقع Fastcode

ووجدت بعض التطبيقات أسرع من CompareText. للأسف يبدو أنها لا تعمل لD2009 وسلاسل يونيكود لها.

والآن بالنسبة للسؤال: هل هناك نسخة أسرع مماثل أن يدعم سلاسل D2009؟ وظائف CompareText يبدو أن دعا الكثير عند استخدام خرائط التجزئة (على الأقل في implemenation أنا باستخدام حاليا)، لذلك تحسن الأداء قليلا يمكن حقا أن تحدث فرقا. أو ينبغي أن تطبيقات قدم هناك أيضا العمل سلاسل يونيكود؟

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

المحلول

والعديد من وظائف FastCode من المحتمل تجميع ويبدو أن تعمل على ما يرام في دلفي 2009، لكنها لن تكون على حق لجميع المدخلات. تلك التي تنفذ في المجمع ستفشل لأنها تفترض الشخصيات هي فقط بايت واحد لكل منهما. وتلك التي نفذت في دلفي أفضل حالا قليلا، ولكنها سوف لا يزال بإرجاع نتائج غير صحيحة في بعض الأحيان لأن فكرة وCompareText القديم للويستند "تحسس حالة الأحرف" على ASCII في حين ينبغي أن يقوم واحد جديد على يونيكود. قواعد التي تعتبر الأحرف نفسها باستثناء الحالة هي <م> كثير مختلفة يونيكود من كيف أنها لASCII.

وأندرياس يقول في تعليق تحت هذا CompareText يونيكود لا يزال يستخدم ASCII قواعد حالة المقارنة، وذلك في عدد من وظائف FastCode يجب أن تعمل بشكل جيد. مجرد إلقاء نظرة لهم على مدى قبل استخدامها للتأكد من انهم لا يجعل أي افتراضات حجم الحرف. يبدو لي أن أذكر أن <م> بعض أدرجت وظائف FastCode في دلفي RTL بالفعل. ليس لدي أي فكرة عما إذا كان CompareText واحد منهم.

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

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

إذا ويستند الطبقة تجزئة خريطة كنت تستخدم على TBucketList، ثم هناك مجال للتحسين في تخزين دلو. تلك الفئة لا تحسب تجزئة على المدخلات بأكمله. ويستخدم المدخلات <م> فقط لتحديد دلو للاستخدام. إذا كانت فئة من شأنه أيضا أن تتبع تجزئة الكاملة يحسب للسلسلة، ثم مقارنات خلال البحث الخطي يمكن أن تذهب أسرع بكثير. مجرد مقارنة التجزئة، وفقط مقارنة سلاسل عندما تتطابق التجزئة تماما. (للحصول على 256 دلو دلو القائمة، وحجم أكبر المعتمدة، بايت واحد فقط من المدخلات يحدد دلو، وبقية يتم تجاهل بايت.) <وأ href = "https://stackoverflow.com/questions/ 547879 / كيف للقضاة عدد من الدلاء مقابل tbucketlist / 548298 # 548298 "> لقد كتب عن TBucketList هنا من قبل.

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