ریاضی بهتر در جاوا اسکریپت؟ – انجمن DEV

بهعنوان یک توسعهدهنده وب که روی تجسم دادهها و پروژههای محاسباتی علمی کار میکند، اغلب متوجه شدهام که قابلیتهای ریاضی بومی جاوا اسکریپت کم است. جستجوی کتابخانه استاندارد قوی من را به سمت stdlib-js سوق داد.
وعده stdlib
پروژه stdlib با مجموعه ای از ویژگی های چشمگیرش نظر من را جلب کرد:
- توابع ریاضی جامع
- روی دقت عددی تمرکز کنید
- سازگاری بین پلتفرمی
- عملکرد گسترده فراتر از ریاضی بومی
محک زدن واقعیت
من معیارهایی را برای مقایسه stdlib با عملیات ریاضی جاوا اسکریپت بومی در 100000 ردیف داده اجرا کردم. نتایج شگفت انگیز بود:
=== Columnar Math Operations Benchmark ===
Columns: 100,000 rows
Iterations: 50 (10 warmup)
=========================================
exp (normal range)
Performance
Native Math | avg: 1.496 ms | best: 1.300 ms
stdlib | avg: 4.330 ms | best: 3.900 ms
Difference | stdlib is 189.44% slower
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
ln/log
Performance
Native Math | avg: 2.878 ms | best: 2.100 ms
stdlib | avg: 3.846 ms | best: 3.300 ms
Difference | stdlib is 33.63% slower
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
log10
Performance
Native Math | avg: 2.942 ms | best: 2.500 ms
stdlib | avg: 4.676 ms | best: 4.100 ms
Difference | stdlib is 58.94% slower
Precision
Max diff | 4.441e-16
Avg diff | 1.142e-17
sin()
Performance
Native Math | avg: 2.844 ms | best: 2.600 ms
stdlib | avg: 3.542 ms | best: 3.200 ms
Difference | stdlib is 24.54% slower
Precision
Max diff | 1.110e-16
Avg diff | 3.101e-18
cos()
Performance
Native Math | avg: 2.870 ms | best: 2.300 ms
stdlib | avg: 3.530 ms | best: 2.900 ms
Difference | stdlib is 23.00% slower
Precision
Max diff | 1.110e-16
Avg diff | 3.039e-18
tan()
Performance
Native Math | avg: 3.828 ms | best: 3.200 ms
stdlib | avg: 5.048 ms | best: 4.600 ms
Difference | stdlib is 31.87% slower
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
asin()
Performance
Native Math | avg: 2.480 ms | best: 2.300 ms
stdlib | avg: 3.044 ms | best: 2.700 ms
Difference | stdlib is 22.74% slower
Precision
Max diff | 2.220e-16
Avg diff | 1.219e-17
acos()
Performance
Native Math | avg: 2.674 ms | best: 2.200 ms
stdlib | avg: 3.454 ms | best: 2.900 ms
Difference | stdlib is 29.17% slower
Precision
Max diff | 4.441e-16
Avg diff | 4.569e-17
atan()
Performance
Native Math | avg: 2.800 ms | best: 2.200 ms
stdlib | avg: 3.188 ms | best: 2.700 ms
Difference | stdlib is 13.86% slower
Precision
Max diff | 1.110e-16
Avg diff | 2.675e-18
atan2()
Performance
Native Math | avg: 2.550 ms | best: 2.100 ms
stdlib | avg: 2.984 ms | best: 2.500 ms
Difference | stdlib is 17.02% slower
Precision
Max diff | 2.220e-16
Avg diff | 6.958e-18
abs()
Performance
Native Math | avg: 1.508 ms | best: 1.200 ms
stdlib | avg: 1.538 ms | best: 1.000 ms
Difference | stdlib is 1.99% slower
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
ceil()
Performance
Native Math | avg: 2.744 ms | best: 2.300 ms
stdlib | avg: 2.822 ms | best: 2.300 ms
Difference | stdlib is 2.84% slower
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
floor()
Performance
Native Math | avg: 2.702 ms | best: 2.200 ms
stdlib | avg: 2.642 ms | best: 2.100 ms
Difference | stdlib is -2.22% faster
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
round()
Performance
Native Math | avg: 2.784 ms | best: 2.300 ms
stdlib | avg: 2.744 ms | best: 2.200 ms
Difference | stdlib is -1.44% faster
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
sqrt()
Performance
Native Math | avg: 1.644 ms | best: 1.100 ms
stdlib | avg: 1.600 ms | best: 1.100 ms
Difference | stdlib is -2.68% faster
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
hypot()
Performance
Native Math | avg: 3.040 ms | best: 2.600 ms
stdlib | avg: 3.004 ms | best: 2.500 ms
Difference | stdlib is -1.18% faster
Precision
Max diff | 0.000e+0
Avg diff | 0.000e+0
خوب
عملیات پایه پیشرفت های اندکی را نشان داد:
- sqrt: 6.23٪ سریعتر
- دور: 3.02٪ سریعتر
- طبقه: 2.02٪ سریعتر
نه چندان خوب
عملیات پیچیده ضربه قابل توجهی خورد:
- تاریخ مصرف: 189.85٪ کندتر
- log10: 59.37% کندتر
- عملکردهای trig: 25-33٪ کندتر
معاملات دقیق
تفاوت دقت حداقل بود، با حداکثر اختلاف 4.441e-16. اکثر عملیاتها نتایج یکسانی بین stdlib-js و ریاضی بومی داشتند.
زمان استفاده از stdlib-js
- عملیات ریاضی پایه
- پروژه هایی که به رفتار متقابل پلت فرم تضمین شده نیاز دارند
- مواردی که نتایج ثابت بیشتر از سرعت خام اهمیت دارد
نگاه به جلو
پتانسیلی برای بهبود وجود دارد – تبدیل stdlib-js به WebAssembly میتواند با اجرای نزدیک به سرعت اصلی، عملکرد را افزایش دهد، بهویژه برای آن دسته از عملیاتهای پیچیده که در حال حاضر کندی قابل توجهی را نشان میدهند. اما تا زمانی که این اتفاق نیفتد، انتخاب بین stdlin-js و ریاضی بومی نیاز به بررسی دقیق نیازهای خاص شما دارد.
خط پایین
stdlib-js یک کتابخانه جامد است که بر اساس وعده سازگاری و عملکرد گسترده آن ارائه می شود. با این حال، مبادلات عملکرد به این معنی است که همیشه بهترین انتخاب نیست. برای پروژههایم، از رویکرد بومی استفاده خواهم کرد و شاید در آینده سعی کنم stdlib-js را در WASM کامپایل کنم تا آزمایش کنم که آیا واقعاً سریعتر است یا خیر.
آیا stdlib را در پروژه های خود امتحان کرده اید؟ من کنجکاو هستم که در مورد تجربیات شما در مورد محاسبات ریاضی در جاوا اسکریپت بشنوم.
منابع