<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ScaleDynamics</title>
    <description>The latest articles on DEV Community by ScaleDynamics (@hoshiwarpsjs).</description>
    <link>https://dev.to/hoshiwarpsjs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F128998%2Fe0fbd947-5a9f-4704-9043-2d595dbe9902.png</url>
      <title>DEV Community: ScaleDynamics</title>
      <link>https://dev.to/hoshiwarpsjs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hoshiwarpsjs"/>
    <language>en</language>
    <item>
      <title>Why Your Browser Benchmark is Lying to You About AI Performance</title>
      <dc:creator>ScaleDynamics</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:58:00 +0000</pubDate>
      <link>https://dev.to/hoshiwarpsjs/why-your-browser-benchmark-is-lying-to-you-about-ai-performance-5gn2</link>
      <guid>https://dev.to/hoshiwarpsjs/why-your-browser-benchmark-is-lying-to-you-about-ai-performance-5gn2</guid>
      <description>&lt;p&gt;For years, we’ve measured web performance through the lens of latency. How fast does this script load? How quickly can the engine execute this single loop? However, the "Document Web" is no longer active. We are now living in the "Compute Web" era—where browsers are expected to run local AI inference, process massive data streams, and handle complex UI states simultaneously.&lt;/p&gt;

&lt;p&gt;Traditional benchmarks are like testing a 16-cylinder engine by checking the speed of a single piston. They don't tell you how the engine performs under actual load.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Single-Task Fallacy: An Outdated View
&lt;/h2&gt;

&lt;p&gt;Most benchmarks (like JetStream or Speedometer) focus on sequential execution. While they are great for measuring JS engine maturity and browser performance, they fail to account for Task Saturation.&lt;/p&gt;

&lt;p&gt;Peak performance in a modern AI WebApp is all about how efficiently the browser can orchestrate concurrent, resource-intensive tasks, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CPU Intensive Work:&lt;/strong&gt; Pre-processing large datasets or 50MB JSON payloads in a Web Worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Intensive Work:&lt;/strong&gt; Running a local AI inference model using WebGPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Main Thread Work:&lt;/strong&gt; Ensuring the UI remains responsive to keep the user interface smooth at 60fps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To perform their best, modern web apps require a benchmark that tests this simultaneous load, because the true bottleneck is often not the raw speed of one component, but the efficient "handoff" and scheduling between all of them. Focusing on a single isolated variable, such as raw GPU speed, fails to capture the "Ultimate Performance" of the application under real-world conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Deep-Dive
&lt;/h2&gt;

&lt;p&gt;At ScaleDynamics, we’ve observed that the true bottleneck in AI-driven web apps is often the "handoff" between the CPU and GPU.&lt;/p&gt;

&lt;p&gt;We built SpeedPower.run out of frustration. Existing browser benchmarks are too synthetic and disconnected from the real-world challenges of the modern web, where real web applications perform heavy pre/post-processing, run multiple AI models, and handle critical rendering simultaneously. Our mission is simple: to create the definitive benchmark for real-world compute performance on the modern web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Simultaneous Load Methodology&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SpeedPower.run determines your browser and device's maximum performance by pushing all CPUs and GPUs to their limit simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79o8fvbwrj94nx84ua70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79o8fvbwrj94nx84ua70.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unlike other tools that test one thing at a time, we run multiple, concurrent tasks, like running AI inferences while also doing heavy JavaScript processing. We use all available web technologies: JavaScript, WASM, WebGL, and WebGPU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How We Ensure a Fair Score (Methodology &amp;amp; Integrity):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The SpeedPower.run benchmark ensures a fair and accurate score by focusing purely on your device's computational power. It achieves this by guaranteeing Zero Network Interference, as the test timer only starts after all large assets, including the ~400MB of AI models, are loaded into memory. Additionally, it implements a Warm-up Execution phase before recording the final score, allowing the browser to finish its internal optimizations (like code compilation) to ensure the result reflects your device's peak performance, not initial slow-down.&lt;/p&gt;

&lt;p&gt;To provide a reliable measurement, the methodology prioritizes Score Stability by using statistical regression analysis on peak metrics to smooth out system-level scheduling noise. This process generates a dependable result that is not based on a single moment in time. For users, the process is simple: since factors outside the benchmark's control (like the operating system) can affect performance, it is recommended to run the test multiple times to confidently capture the highest possible score your device can achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmarks
&lt;/h2&gt;

&lt;p&gt;SpeedPower.run consists of the following core benchmarks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JavaScript:&lt;/strong&gt; This benchmark measures raw computational power for pre/post-processing on JS objects and JSON. It utilizes four tests from the Apple/WebKit JetStream 2 suite: Access Binary Trees, Control Flow Recursive, Regexp DNA, and String Tag Cloud. We run these benchmarks in parallel across multiple Web Workers to measure the maximum multi-core CPU processing power.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI with TensorFlow.js:&lt;/strong&gt; We utilize TensorFlow.js to test the maturity and performance of established web AI pipelines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Recognition TFJS: Measures the steady-state inference throughput of the BlazeFace model (via TensorFlow.js). Using a 128x128 input tensor and a pre-warmed graph, this test isolates the raw performance of the backend (JavaScript, WASM, WebGL, or WebGPU). It specifically measures the speed of the forward pass and the subsequent interpretive post-processing (decoding the highest-confidence face detection).&lt;/li&gt;
&lt;li&gt;AI Classify TFJS: This benchmark measures the throughput of the MobileNetV3 Small architecture. Using a fixed 224x224 input tensor and a pre-warmed graph, this test isolates the raw performance of the backend (JavaScript, WASM, WebGL, or WebGPU). It specifically measures the speed of the forward pass and the subsequent interpretive post-processing (decoding the highest-confidence score).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;AI with Transformers.js:&lt;/strong&gt; SpeedPower.run pushes the boundaries of next-gen in-browser AI by leveraging Transformers.js v3 for our most advanced workloads.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Classify Transformers: Measures the throughput of the MobileNetV4-Small architecture (via Transformers.js v3). It prioritizes a high-performance WebGPU backend (falling back to WebGL) with a fixed 224x224 input tensor. This score reflects the system's capacity for parallel inference, leveraging asynchronous command queues and compute shaders to process workloads with high concurrency.&lt;/li&gt;
&lt;li&gt;AI LLM Transformers: Measures the throughput of the SmolLM2-135M-Instruct causal language model (via Transformers.js v3). Using a 4-bit quantized (q4) ONNX model, this benchmark isolates the GPU runtime efficiency from model loading overhead. It captures the hardware's ability to orchestrate multi-threaded LLM execution and real-time autoregressive decoding.&lt;/li&gt;
&lt;li&gt;AI Speech Transformers: Measures the throughput of the Moonshine-Tiny automatic speech recognition (ASR) architecture. It uses a hybrid-precision model (FP32 encoder + q4 decoder) to isolate GPU runtime efficiency from audio processing overhead. The score highlights the capacity for complex, high-concurrency speech-to-text pipelines.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exchange:&lt;/strong&gt; Since modern apps rely on Web Workers, the "Exchange" benchmark measures the communication bottleneck between the main thread and workers. It tests the transfer speed of IPC, Transferables, Arrays, Buffers, Objects, and OffScreen Canvas. The higher the score, the more efficiently your main thread communicates with background workers.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture: No Installation Required
&lt;/h2&gt;

&lt;p&gt;We were adamant that this should require zero installation or setup. By leveraging WebAssembly (WASM) and WebGPU, we can access the bare metal of your device directly through the browser.&lt;/p&gt;

&lt;p&gt;You don't need to download a 5GB suite to see if your rig is ready for the AI web. You just click, and in 30 seconds, we saturate every available thread to find your browser's breaking point for modern, complex applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Help Us Calibrate the Benchmark
&lt;/h2&gt;

&lt;p&gt;We are currently collecting data across thousands of hardware/browser combinations to refine our scoring for the "Ultimate Performance" of the modern web.&lt;/p&gt;

&lt;p&gt;We’ve seen some fascinating anomalies already, like high-end mobile ARM chips showing better task-switching efficiency than some mid-range x86 desktops due to better thermal-aware scheduling in the browser.&lt;br&gt;
Run the test on your dev rig: &lt;a href="https://speedpower.run/?ref=devto-1" rel="noopener noreferrer"&gt;https://speedpower.run&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Does the result match your "real-world" multitasking experience? Drop your score and your hardware specs in the comments. Let’s talk about the future of the compute-heavy web.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to speed up Node.js matrix computing with Math.js 🌠</title>
      <dc:creator>ScaleDynamics</dc:creator>
      <pubDate>Thu, 07 Feb 2019 14:09:13 +0000</pubDate>
      <link>https://dev.to/hoshiwarpsjs/how-to-speed-up-nodejs-matrix-computing-with-mathjs--3o68</link>
      <guid>https://dev.to/hoshiwarpsjs/how-to-speed-up-nodejs-matrix-computing-with-mathjs--3o68</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://medium.com/starnodejs/speeding-up-matrix-computation-with-node-js-8e1201a164b2" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; by &lt;a href="https://twitter.com/domis66" rel="noopener noreferrer"&gt;Dominique Péré&lt;/a&gt;, a member of &lt;a href="//www.warpjs.dev"&gt;WarpJS&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;This is part 1 of a series of articles on micro-benchmarks for matrix computations. This first article focuses on a math.js benchmark, and part 2 will discuss a TensorFlow benchmark. Make sure to subscribe if you don’t want to miss it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this article, you will learn how performing parallel computations can speed up the multiplication of two matrices.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I recently had occasion to revisit some of the math I learned in high school. Finally, I can see the use of all those matrix multiplication exercises! My background is in IT engineering, but I have to admit that AI involves much more math than IT does.&lt;/p&gt;

&lt;p&gt;I am now working for the company that is developing Starnode, a JavaScript library designed to speed up node.js. The only problem with &lt;strong&gt;JavaScript is that it is only able to carry out computations using a single thread, a single process and the CPU&lt;/strong&gt; (it’s like a restaurant with only one chef in the kitchen!). Why is JavaScript designed like this? The purpose is to keep it simple and non-blocking. You can find out a lot more about this aspect of JavaScript in this article.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why matrix computing take forever
&lt;/h1&gt;

&lt;p&gt;Matrix multiplication is a recurring operation performed in many domains, such as signal processing, data analysis and, more recently, AI.&lt;/p&gt;

&lt;p&gt;In these use cases, the matrices implemented are rather large, frequently containing more than a thousand lines. Let’s assume we are multiplying two matrices, each one with dimensions 1000 × 1000. The number of operations that would need to be performed would be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;2 × 1,000³ − 1,000² = 1,999,000,000&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s right — nearly 2 billion operations! It’s no surprise the CPU is so busy when performing such computations. With so much on its plate, it can’t do anything else! So let’s see what we can do to free up the main CPU thread and event loop and speed up the process.&lt;/p&gt;

&lt;h1&gt;
  
  
  The key to speeding up matrix computation: parallelization
&lt;/h1&gt;

&lt;p&gt;Here is the challenge: to speed up the multiplication of two large matrices with a single-threaded node. Well, we could have used the child_process library to fork another process and assign parts of the job to the forked process (or have done the same with the worker threads), but we wanted to keep our code simple and come up with a solution that will work with a variable number of CPU/threads. By chance, we have some of the most skilled virtual machine PhDs and engineers working with us to help us optimize the parallelization, and we created Starnode, a very simple API that can be used to parallelize any standard JavaScript function. Now with the ability to perform fine-grained parallelization, we worked to determine how much time would be saved with large matrix computations.&lt;/p&gt;

&lt;p&gt;My hardware engineer colleague (who happens to be a former math professor!) and I focused on possible ways to parallelize a sequential algorithm, as this would allow us to split operations for large matrices between multiple processing resources using the JavaScript-based ScaleDynamics “warp,” a dynamic compiler technology. (more to come about this is in another story).&lt;/p&gt;

&lt;h1&gt;
  
  
  Splitting and computing in parallel
&lt;/h1&gt;

&lt;p&gt;To parallelize matrix multiplication efficiently, be it with Starnode technology or using any other parallelization technique, one must start by identifying independent blocks of operations that can take place concurrently, with minimal overhead time for the execution of splits and recombinations and minimum data transfer.&lt;/p&gt;

&lt;p&gt;We tried two different approaches, splitting down matrices band-wise in the first approach, and splitting tile-wise in the second. Band-wise splitting worked well for small matrices, but when we tried with larger matrices (a 400 hundred lines or more), we found that tile-wise splitting was the best way to go.&lt;/p&gt;

&lt;p&gt;Below, one can see how these two input-matrix splitting schemes are implemented for the product R = A × B:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the case of a band-wise split, A is split into blocks of consecutive rows. Each block Ai is then multiplied by the full matrix B, yielding the result Ri, which constitutes a block of consecutive rows in the product matrix R.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;figcaption&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2AqPouZE6nfaoyx8rd2d7kZQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2AqPouZE6nfaoyx8rd2d7kZQ.jpeg" title="Figure 1a: band-wise split" alt="alt text" width="640" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1a: band-wise split&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In a tile-wise split, A is split into blocks of consecutive rows and B into blocks of consecutive columns. Each block Ai is then multiplied by the block Bi, yielding Ri, which constitutes a “tile” in the product matrix R.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2AL51Y_HFGfVchuS5Pwd44Hg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2AL51Y_HFGfVchuS5Pwd44Hg.jpeg" title="Figure 1b: tile-wise split" alt="alt text" width="638" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1b: tile-wise split&lt;/em&gt;&lt;br&gt;
Matrix shapes have little impact for a given number of elements, as long as the form factor of the matrix is not excessively rectangular. With small matrices, band-wise splits entail slightly less parallelization overhead than tile-wise splits thanks to the faster B-matrix readings and very straightforward process for merging blocks in the product matrix. This advantage vanishes rapidly, however, as the size of the B matrix increases due to the cache hierarchy conflicts that result from all processes using full B array data.&lt;/p&gt;

&lt;h1&gt;
  
  
  The CPUs are burning!
&lt;/h1&gt;

&lt;p&gt;As our approach effectively uses all the resources of your computer, you can expect the fans to run faster, the temperature to increase and your matrices to be computed in a snap!&lt;/p&gt;

&lt;p&gt;We have run all our tests on a dedicated server with a CPU Intel i7–7700 4 core/8 threads 4.2GHz and 32GB RAM.&lt;/p&gt;

&lt;p&gt;The following chart shows the time required to multiply math.js matrices of various sizes in node.js without Starnode and with Starnode, as well as the speedup factor when using Starnode in each case. As you can see, the larger the matrix is, the larger the speedup!&lt;/p&gt;

&lt;p&gt;This chart shows only the results of using the tile-wise parallelization method, as this method provided the best performance with node.js for matrices larger than 400 × 400.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2AT68YyF1nG1YwImpMsNkXng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2AT68YyF1nG1YwImpMsNkXng.png" title="As you can see, node.js with Starnode completed matrix multiplication up to six times faster than regular node.js!" alt="alt text" width="623" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;As you can see, node.js with Starnode completed matrix multiplication up to six times faster than regular node.js!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can find below the detailed results for the two split methods. In this table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;m is the number of lines in the A matrix&lt;/li&gt;
&lt;li&gt;p is the number of lines in the B matrix (as well as the number of columns in A)&lt;/li&gt;
&lt;li&gt;n is the number of columns in the B matrix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2Aj4yQXXhI6ZVnfM8g0Y517g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F880%2F1%2Aj4yQXXhI6ZVnfM8g0Y517g.png" title="Table with speed-up factor" alt="alt text" width="525" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are very excited with these results, as we initially only expected to achieve a speedup factor of 2 or 3 at this scale of parallelization. Surprisingly, when implementing Starnode parallelization, very little overhead is required to make two processes “talk to each other,” resulting in much-improved computation speeds. For example, for the multiplication of a 2000 × 1200 matrix, we achieved a speedup factor of 6.1! ⚡&lt;/p&gt;

&lt;p&gt;The team is also currently working on a TensorFlow benchmark with the same operating mode, which I will link to here soon. Make sure to subscribe to learn new math skills to impress your colleagues! 🤓&lt;/p&gt;




&lt;p&gt;Thank you for reading! If you liked this article (or if you didn’t), feel free to leave a comment. We'll do our best to reply and update this article accordingly.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>startup</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
