برنامه نویسی

ریاضی بهتر در جاوا اسکریپت؟ – انجمن 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 را در پروژه های خود امتحان کرده اید؟ من کنجکاو هستم که در مورد تجربیات شما در مورد محاسبات ریاضی در جاوا اسکریپت بشنوم.


منابع

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا