إصدارتحليل · على الرادارSimon Willison→ المصدر

سايمون ويليسون وClaude يسرّعان تحليل الأرقام في SQLite من 67 إلى 19 نانوثانية

يحتاج المبلغ «-$1,234.56» القادم من ملف CSV إلى تنظيف قبل أن يمكن جمعه في SQLite. طلب سايمون ويليسون من Claude مقارنة إضافات بلغتي C وRust لهذه المهمة: تبيّن أن النسخ الأولى بلغة Rust أسرع، رغم أنها تشغل حجمًا أكبر بكثير. وبعد استبدال المحلّل القياسي في C، انخفض زمن معالجة السطر على البيانات المختلطة من 67 إلى 19 نانوثانية، مقابل 41–46 نانوثانية لدى Rust.

معالج بواسطة الذكاء الاصطناعي من Simon Willison؛ بتحرير Hamidun News
سايمون ويليسون وClaude يسرّعان تحليل الأرقام في SQLite من 67 إلى 19 نانوثانية
المصدر: Simon Willison. كولاج: Hamidun News.
استمع للمقال
بطاقة الحقائق والأرقام
المعيارالتفاصيل
المصدر الأصليSimon Willison ↗
رئيس التحرير
حقيقة رئيسية #1بلغ حجم الإضافة بلغة C ‏14 كيلوبايت، ونسختا Rust ‏298 و321 كيلوبايت.
حقيقة رئيسية #2شملت القياسات مليوني سطر؛ وتتوقف النتيجة على تركيبة البيانات.
حقيقة رئيسية #3قبل اختيار اللغة، تحقق من الدالة التي تستهلك الوقت.

صدّرتَ المدفوعات إلى ملف CSV وحمّلتها في SQLite، فإذا بعمود المبالغ يحتوي «-$1,234.56». بالنسبة للإنسان هذا رقم، أما بالنسبة لقاعدة البيانات فهو سلسلة نصية يجب تحليلها قبل الجمع والفرز. أراد سايمون ويليسون أن يختبر مدى صعوبة إضافة دالة parse_number() لهذا الغرض، وكلّف Claude بمقارنة تنفيذين بلغتي C وRust.

جاءت النتيجة تجربة هندسية صغيرة لكنها مفيدة. في البداية تفوقت Rust في السرعة، وتفوقت C في حجم الإضافة. ثم طلب ويليسون استبدال دالة تحليل الأرقام في C، فتغيّر المشهد: على البيانات المختلطة انخفض زمن معالجة السطر من 67 إلى 19 نانوثانية. والدرس العملي هنا يكمن في كيف يمكن لمقطع واحد من الشيفرة أن يغيّر نتيجة المقارنة بين اللغات.

دالة SQL واحدة بدل التنظيف في كل استعلام

مهمة parse_number() بسيطة: إزالة الفواصل ورموز العملات وعلامة النسبة المئوية من السلسلة، ومراعاة علامة الناقص في البداية، وإرجاع القيمة العددية. وإذا تعذّر تحليل السلسلة، ترجع الدالة NULL. يتيح هذا السلوك نقل التنظيف المتكرر إلى إضافة SQLite ثم استخدام النتيجة في الحسابات.

مثلًا، يتحول «-$1,234.56» بعد حذف الدولار وفاصل الآلاف إلى -1234.56. وبعدها يمكن جمع هذه القيمة مع مدفوعات أخرى أو فرزها كرقم. ولا يضطر المطوّر إلى إعادة بناء سلسلة من الاستبدالات النصية في كل استعلام.

أما النسب المئوية فتستحق تحديد قواعدها على حدة. ففي طلبه الأول اقترح ويليسون حذف علامة النسبة المئوية. لكن في منتج بعينه يجب تحديد ما إذا كانت «12.5%» تعني الرقم 12.5 أم الكسر 0.125. وتتوقف صحة الحسابات اللاحقة على ذلك. والتحليل السريع للسلسلة بحد ذاته لا يتخذ هذا القرار نيابةً عن الفريق.

لماذا بدت Rust أسرع في البداية

أعدّ Claude نسخًا من الإضافة بلغة C ومع مكتبتين بلغة Rust: ‏rusqlite وsqlite-loadable-rs. ووفق ويليسون، بلغ حجم الإضافة المجمّعة بلغة C ‏14 كيلوبايت. أما نسختا Rust فبلغتا 321 و298 كيلوبايت على الترتيب. وبالنسبة لأداة مدمجة صغيرة قد يكون لهذا الفارق أهمية.

غير أن النسخة الأولى بلغة C كانت أبطأ. فعلى البيانات المختلطة بلغت تكلفة المعالجة الإضافية فيها 67 نانوثانية للسطر، بينما سجّلت نسختا Rust ‏46 و41 نانوثانية. وأرجع ويليسون الفارق إلى تحليل الأرقام: فالآلية المستخدمة في Rust كانت أسرع من الدالة القياسية strtod في C.

كان الطلب التالي إلى Claude محددًا: كتابة دالة خاصة بلغة C لتحليل الأعداد العشرية، قادرة على اللحاق بـRust أو تجاوزها. وبعد هذا الاستبدال سجّلت نسخة C زمن 19 نانوثانية على البيانات المختلطة، و16 نانوثانية على الأعداد الصحيحة، و18 نانوثانية على الكسور العشرية.

وللمقارنة: على الكسور العشرية احتاجت النسخة الأصلية بلغة C إلى 106 نانوثانية، بينما احتاجت نسختا Rust إلى 55 و47 نانوثانية. وجميع القياسات المذكورة تعود إلى تجربة على مليوني سطر. والحديث هنا عن تكلفة المعالجة الإضافية للسطر، لذا لا يجوز نقل هذه الأرقام مباشرة إلى زمن تنفيذ استعلام SQL كامل.

ما الذي يجب التحقق منه قبل الاستخدام

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

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

كما طلب ويليسون من Claude صياغة البحث ونشر النتيجة في مستودع simonw/research. وهي للمطوّر نقطة انطلاق: أعد القياسات على بياناتك المصدَّرة، وتحقق من الصحة، ثم اختر التنفيذ. وقد ساعد Claude في هذه القصة على قطع الطريق بسرعة من الفكرة إلى عدة نسخ مقيسة؛ ومع ذلك يبقى تقييم ملاءمتها مرهونًا بمتطلبات النظام المعني.

القصة

أسئلة وأجوبة حول الخبر

ما أبرز التفاصيل حول دالة SQL واحدة بدل التنظيف في كل استعلام؟

مهمة parse_number() بسيطة: إزالة الفواصل ورموز العملات وعلامة النسبة المئوية من السلسلة، ومراعاة علامة الناقص في البداية، وإرجاع القيمة العددية. وإذا تعذّر تحليل السلسلة، ترجع الدالة NULL. يتيح هذا السلوك نقل التنظيف المتكرر إلى إضافة SQLite ثم استخدام النتيجة في الحسابات. مثلًا، يتحول «-$1,234.56» بعد حذف الدولار وفاصل الآلاف إلى -1234.56. وبعدها يمكن جمع هذه القيمة مع مدفوعات أخرى أو فرزها كرقم. ولا يضطر المطوّر إلى إعادة بناء سلسلة من الاستبدالات النصية في كل استعلام.

ما أبرز التفاصيل حول لماذا بدت Rust أسرع في البداية؟

أعدّ Claude نسخًا من الإضافة بلغة C ومع مكتبتين بلغة Rust: ‏rusqlite وsqlite-loadable-rs. ووفق ويليسون، بلغ حجم الإضافة المجمّعة بلغة C ‏14 كيلوبايت. أما نسختا Rust فبلغتا 321 و298 كيلوبايت على الترتيب. وبالنسبة لأداة مدمجة صغيرة قد يكون لهذا الفارق أهمية. غير أن النسخة الأولى بلغة C كانت أبطأ. فعلى البيانات المختلطة بلغت تكلفة المعالجة الإضافية فيها 67 نانوثانية للسطر، بينما سجّلت نسختا Rust ‏46 و41 نانوثانية.

ما أبرز التفاصيل حول ما الذي يجب التحقق منه قبل الاستخدام؟

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

ZK
جمال حميدون — مدير المنتجات في Alpina Digital ومدير منتج AlpinaGPT. يبني منتجات الذكاء الاصطناعي منذ 2019. بدأ Hamidun News كمشروع شخصي ثم أصبح مُجمِّعًا إنتاجيًا بأكثر من 6000 قارئ.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
ما رأيك؟
جارٍ تحميل التعليقات…