البرمجة

تسريع وتحسين أداء برامج C لمعالجة ملفات DDS

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

أولاً وقبل كل شيء، يُفضل دائمًا توفير تعليقات وشروحات داخل الشيفرة لجعلها أكثر وضوحاً للقراء. هذا يساعد على فهم الهدف من الشيفرة والتغييرات المحتملة.

ثانيًا، يمكن تحسين الكود من خلال استخدام أفضل ممارسات البرمجة. على سبيل المثال، استخدام الحلقات والدوال بشكل أفضل يمكن أن يساعد في تحسين قابلية الصيانة والقراءة.

ثالثًا، يمكن استخدام الذاكرة بشكل أكثر فعالية. في الشيفرة الحالية، تم استخدام malloc و free لحجز وتحرير الذاكرة. ومع ذلك، يمكن استخدام calloc بدلاً من malloc لتخصيص وتهيئة الذاكرة بنفس الوقت.

رابعًا، استخدم مكتبات إدخال وإخراج C++ () بدلاً من مكتبات C () لتسهيل إدارة النصوص والمتغيرات.

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

ستتمثل الخطوة الأولى في توضيح الشيفرة وتحسينها قدر الإمكان.

المزيد من المعلومات

قمت بتحسين الشيفرة البرمجية الخاصة بك بناءً على الملاحظات المذكورة وأفضل ممارسات البرمجة. يرجى مراجعة الكود المعدل أدناه:

cpp
#include #include #include #include #define DDS_MAGIC "DDS " const int MAX_SEGMENTS = 10240; int ipos[MAX_SEGMENTS]; int iposind = 0; int tfilelen; char* TransBuf = nullptr; void processDDS(const char* inputFileName); int main(int argc, char** argv) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " filename" << std::endl; return 1; } const char* inputFileName = argv[1]; processDDS(inputFileName); return 0; } void processDDS(const char* inputFileName) { std::ifstream sFile(inputFileName, std::ios::binary | std::ios::ate); if (!sFile.is_open()) { std::cerr << "Error opening file: " << inputFileName << std::endl; return; } tfilelen = sFile.tellg(); sFile.seekg(0, std::ios::beg); TransBuf = new char[tfilelen]; sFile.read(TransBuf, tfilelen); sFile.close(); char qc = DDS_MAGIC[0]; for (int i = 0; i < tfilelen; i++) { if (TransBuf[i] != qc) continue; if (std::strncmp(DDS_MAGIC, TransBuf + i, 4) == 0) { ipos[iposind] = i; iposind++; } } ipos[iposind] = tfilelen; for (int i = 0; i < iposind; i++) { char ofn[256]; const char* s = TransBuf + ipos[i]; int l = ipos[i + 1] - ipos[i]; if (l < 4) continue; // Don't write out DDS files with no data // Write each DDS segment to its own file std::sprintf(ofn, "%s_%d.dds", inputFileName, i); std::ofstream tFile(ofn, std::ios::binary); tFile.write(s, l); tFile.close(); // Add a pause for displaying the processed image count std::system("pause"); } delete[] TransBuf; std::cout << "Extracted " << iposind << " files" << std::endl; }

تم استبدال مكتبات الإدخال والإخراج C بمكتبات C++ () لتحسين إدارة النصوص والتحكم في المتغيرات. تم أيضًا استخدام std::ifstream و std::ofstream لتحسين التعامل مع الملفات.

تم أيضًا استخدام new و delete[] بدلاً من malloc و free لتحسين إدارة الذاكرة.

قمت بإنشاء دالة منفصلة processDDS لتحسين هيكل البرنامج وجعله أكثر وضوحًا. يمكن استخدام هذه الدالة لمعالجة المزيد من الملفات DDS بسهولة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر