# إعادة كتابة Zig لدالة strspn في libc تجعل إدخال 40 ألف سجل في SQLite يستغرق دقائق على لينكس

> **المغزى:** المغزى: التكلفة التي تتضاعف مع حجم البيانات قد تختبئ في دالة تبدو عادية تحت الكود الذي يكتبه المطور، فيبقى كوده سليمًا في نظره، ولا يكشفها إلا الـ profiler.

- المصدر: المغزى (https://almaghza.com/a/2026-11-06-zig-strspn-sqlite-slowdown/)
- التاريخ: 26 جمادى الأولى - 6 نوفمبر 2026 (2026-11-06)
- القسم: برمجيات
- الوسوم: Zig، SQLite، تحسين الأداء، Linux

نشر المطور Dennis Forbes في 26 أكتوبر 2026 مقالًا عن عملية إدخال لنحو 40 ألف سجل JSON في قاعدة SQLite، كان يُفترض أن تستغرق مللي ثوانٍ، فاستغرقت دقائق واستهلكت نواة معالج كاملة. والغريب أن نسخة macOS من البرنامج كانت سليمة، وأن المشكلة اقتصرت على نسخة لينكس.

والفرق الوحيد بين النسختين أن نسخة لينكس بُنيت باستخدام zig cc عبر cargo-zigbuild. ومن هنا بدأ التتبع.

فقد أعادت لغة Zig كتابة دوال libc بلغتها بدل الاعتماد على نسخة musl، ومن هذه الدوال strspn. والنسخة الجديدة من الدالة تبدأ بقياس طول السلسلة النصية كاملة. أما الـ tokenizer الذي يقرأ الـ JSON فيمر على النص حرفًا حرفًا، ويستدعي هذه الدالة في كل خطوة على ما تبقى من النص. والنتيجة أن كل استدعاء يعيد قياس بقية الملف من أوله.

بهذا يتحول عمل يُفترض أن يتناسب مع حجم الملف إلى عمل يتناسب مع مربع حجمه، مخبّأً داخل دالة تبدو عادية. وحسب صاحب المقال أن تقسيم ملف حجمه 1.2 ميجابايت صار أبطأ بنحو 12,000 مرة بهذا النمط. ولم يذكر المقال أرقامًا خامًا ولا نسخة Zig المستخدمة. وهذا النمط سمّاه Joel Spolsky قديمًا «Shlemiel the Painter»، ويقول المقال إنه موجود أيضًا في strcspn وstrpbrk وstrstr.

ولم يذكر المقال أن المشكلة أُصلحت في Zig نفسها، والحل الذي اعتمده صاحبه كان إزالة المسافات من الـ JSON قبل إدخاله.

والدرس يتجاوز Zig. فالتكلفة المتراكمة قد تحدث في طبقة تحت الكود الذي يكتبه المطور، بينما يبدو كوده سليمًا تمامًا، والوسيلة الوحيدة لرؤيتها هي الـ profiler. ويهم ذلك خاصة الفرق التي تبني نسخ لينكس من مشاريعها عبر zig cc.

## المصادر

- [مقال Dennis Forbes](https://dennisforbes.ca/blog/microblog/2026/10/the_accidental_12000x_sqlite_slowdown/)
- [مقال Joel Spolsky الذي سمّى النمط Shlemiel the Painter](https://www.joelonsoftware.com/2001/12/11/back-to-basics/)
