القراءة من مقبس 1 بايت الوقت مقابل القراءة في قطعة كبيرة

StackOverflow https://stackoverflow.com/questions/931713

  •  06-09-2019
  •  | 
  •  

سؤال

ما الفرق - الحكمة - بين القراءة من مأخذ 1 بايت الوقت مقابل القراءة في كبيرة شوونك ؟

يجب تطبيق C++ التي تحتاج إلى سحب صفحات من خادم الويب و تحليل تلقت صفحة سطر سطر.حاليا أنا أقرأ 1 بايت في كل مرة حتى لا تواجه CRLF أو ماكس من 1024 بايت يتم التوصل إليه.

إذا كانت القراءة في قطعة كبيرة(مثلا ، 1024 بايت في كل مرة) هو أفضل بكثير الحكمة ، أي فكرة عن كيفية تحقيق نفس السلوك لدي حاليا (أييجري قادرة على تخزين ومعالجة 1 html خط في وقت واحد - حتى CRLF دون استهلاك خلفا بايت حتى الآن)?

تحرير:

لا أستطيع تحمل كبيرة جدا المخازن المؤقتة.أنا في ضيق جدا قانون الميزانية كما يستخدم التطبيق في جزءا لا يتجزأ من جهاز.يفضل إبقاء ثابت واحد فقط-حجم المخزن المؤقت ، ويفضل عقد html خط في وقت واحد.هذا يجعل تحليل و معالجة أخرى سهلة كما أنا من زمان أحاول الوصول إلى المخزن المؤقت من أجل تحليل, أنا يمكن أن نفترض أن أنا تجهيز واحدة html كاملة خط.

شكرا

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

المحلول

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

لماذا ؟ القراءة على المقبس هو نظام الدعوة ، وتسبب ذلك في سياق التبديل على كل قراءة ، وهو أمر مكلف.قراءة المزيد حول هذا الموضوع: IBM تقنية ليب:دفعة مأخذ العروض

نصائح أخرى

لا يمكنني التعليق على C ++، ولكن من منصات أخرى - نعم، هذا يمكن أن يجعل كبير فرق؛ لا سيما في مقدار التبديلات التي يحتاجها التعليمات البرمجية، وعدد المرات التي تحتاجها للقلق بشأن طبيعة ASYNC للتدفقات وما إلى ذلك.

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

أولا وأبسط:

cin.getline(buffer,1024);

ثانيا، عادة ما يتم تخزين جميع IO حتى لا تحتاج إلى القلق كثيرا

ثالثا، تبدأ عملية CGI عادة ما تكاليف أكثر من ذلك بكثير من معالجة الإدخال (ما لم يكن ملف ضخم) ... لذلك قد لا تفكر في الأمر.

g'day،

أحد يضرب الأداء الكبير من خلال القيام بذلك بايت واحدة في المرة هو أن سياقك يذهب من وقت المستخدم إلى وقت النظام مرارا وتكرارا. وأكثر. غير فعال على الإطلاق.

الاستيلاء على قطعة كبيرة واحدة، عادة ما يصل إلى حجم mtu، هو أكثر فعالية بشكل كبير.

لماذا لا تفحص المحتوى في متجه وتكرره من خلال النظر في N لفصل المدخلات الخاصة بك إلى خطوط إدخال الويب؟

هذر

في صحتك،

أنت لا تقرأ بايت واحدا في وقت واحد من المقبس، فأنت تقرأ بايت واحدا في ATIME من نظام C / C ++ I / O، والذي إذا كنت تستخدم CGI سيؤدي إلى تشغيل جميع المدخلات من المقبس. تتمثل النقطة بأكملها من I / O المخزن المؤقت في جعل البيانات متوفرة للمبرمج بطريقة مريحة معالجتها، لذلك إذا كنت ترغب في معالجة بايت واحدة في كل مرة، استمر في المستقبل.

يحرر: عند التفكير، ليس من الواضح من سؤالك إذا كنت تنفذ CGI أو فقط باستخدامه. يمكنك التحقق من ذلك عن طريق نشر مقتطف رمز يشير إلى كيفية قراءة القراءة حاليا بايت واحد.

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

إذا كنت محترما إلى مخزن مؤقت صغير، فاستخدم خوارزميات التخزين المؤقت الكلاسيكية مثل:

getbyte:
   if buffer is empty
      fill buffer
      set buffer pointer to start of buffer
   end
   get byte at buffer pointer
   increment pointer

يمكنك فتح ملف المقبس descritpor مع وظيفة FDOPEN (). ثم قمت بتوجه مؤقتا حتى تتمكن من الاتصال fgets () أو ما شابه ذلك في هذا الواصف.

لا يوجد فرق على مستوى نظام التشغيل، يتم تخزين البيانات مؤقتا على أي حال. ومع ذلك، يجب تطبيق طلبك المزيد من التعليمات البرمجية "قراءة" بايت واحد في وقت واحد.

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