Avatar ·

لماذا ينتج GCC كودًا أسرع بنسبة 15-20% عند التحسين للحجم (-Os) بدلاً من التحسين للسرعة (-O2)؟

مرحبًا بالجميع! أنا مبتدئ في C++ وأحاول فهم أعلام التحسين (optimization flags) في GCC. لدي برنامج صغير لمعالجة الصور: أقوم بتطبيق مرشح Gaussian (Gaussian filter) على مصفوفة البكسل (بحجم 4096x4096). أقوم بتجميعه بأعلام مختلفة وأقيس وقت التنفيذ. كما هو متوقع، يعطي -O2 تحسنًا مقارنة بـ -O0. لكنني لاحظت شيئًا غريبًا: مع العلم -Os (التحسين لحجم الكود) يعمل البرنامج أسرع بنسبة 15-20% من -O2 (التحسين للسرعة)! هذا هو الكود المبسط:\n\n```cpp\n#include \n#include \n#include \n\nvoid gaussian_blur(const std::vector& src, std::vector& dst, int width, int height) {\n const float kernel[5] = {0.0545, 0.2442, 0.4026, 0.2442, 0.0545};\n for (int y = 0; y < height; ++y) {\n for (int x = 0; x < width; ++x) {