You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/en/2025/webassembly.md
+13-21Lines changed: 13 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,6 @@ doi: 10.5281/zenodo.18258991
24
24
25
25
WebAssembly (Wasm) has evolved from a web-centric optimization tool into a high-performance, universal bytecode format. Officially <ahreflang="en"href="https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/">a W3C standard since 2019</a>, the ecosystem reached a technical turning point with the release of <ahreflang="en"href="https://webassembly.github.io/spec/core/">Wasm Version 3.0 in December 2025</a>. This version standardizes several <ahreflang="en"href="https://webassembly.github.io/spec/core/">advanced features</a>—such as Garbage Collection, 64-bit address space, and Multiple Memories—allowing high-level languages like Java, Kotlin, and Dart to run natively and efficiently in both browser and standalone environments.
26
26
27
-
28
27
## Methodology
29
28
30
29
We follow the same methodology from [the 2021 Web Almanac](../2021/webassembly#methodology), where WebAssembly was introduced for the first time.
@@ -33,19 +32,16 @@ We follow the same methodology from [the 2021 Web Almanac](../2021/webassembly#m
33
32
34
33
**Analysis:** In addition to the HTTP Archive dataset, we use <ahreflang="en"href="https://github.com/nimeshgit/almanac-wasm-stats">almanac-wasm-stats</a> a tool to download and validate the WebAssembly modules identified from the HTTP Archive for local analysis. This tool extracts metadata from these downloaded files, allowing us to identify programming languages, libraries, and specific features used within the Wasm modules.
35
34
36
-
37
-
-**Limitations:** Our tool `almanac-wasm-stats` focuses on static analysis of Wasm modules and does not execute them. Therefore, we cannot capture dynamic behaviors or runtime features that may be present during actual execution in a browser or standalone environment. Additionally, some Wasm modules may be obfuscated or minified, which can limit our ability to accurately identify their characteristics.
35
+
**Limitations:** Our tool `almanac-wasm-stats` focuses on static analysis of Wasm modules and does not execute them. Therefore, we cannot capture dynamic behaviors or runtime features that may be present during actual execution in a browser or standalone environment. Additionally, some Wasm modules may be obfuscated or minified, which can limit our ability to accurately identify their characteristics.
38
36
We have enhanced ([wasm-stats](https://github.com/HTTPArchive/wasm-stats)) and implemented below features in almanac-wasm-stats that helps in language usage analysis.
39
37
40
-
1. It can take inputs in **url and respective user-agent strings** that improves download task.
41
-
2. Accept huge number of input in the format of **BigQuery's JSONL result**.
42
-
3.**Validate Wasm** and provide insights with Binary Toolkit that helps to improve stats (ref. wasm2wat)
43
-
4.**Run and Trace tasks activities concurrently** i.e. wasm file downloading, validating and populating stats.
44
-
5.**Enhances language identifiers** for old rust implimentation
45
-
([wasm-stats](https://github.com/HTTPArchive/wasm-stats)) and added new languages : Scala, Dotnet/Mono, Go & TinyGo, TeaVM based languages, Kotlin; This reduces the language usage : "Unknown" numbers
46
-
and improves language stats.
47
-
6. Produce **full Wasm language usage stats** along with validation and download failures.
48
-
7. Tool's **plug-n-play architecture** that helps to introduce new stats with WebAssembly Toolkit / SDK in JSON existing stats format for future enhancements.
38
+
1. It can take inputs in url and respective user-agent strings that improves download task.
39
+
2. Accept huge number of input in the format of BigQuery's JSONL result.
40
+
3. Validate Wasm** and provide insights with Binary Toolkit that helps to improve stats (ref. wasm2wat)
41
+
4. Run and Trace tasks activities concurrently** i.e. wasm file downloading, validating and populating stats.
42
+
5. Enhances language identifiers for old rust implimentation ([wasm-stats](https://github.com/HTTPArchive/wasm-stats)) and added new languages : Scala, Dotnet/Mono, Go & TinyGo, TeaVM based languages, Kotlin; This reduces the language usage : "Unknown" numbers and improves language stats.
43
+
6. Produce full Wasm language usage stats along with validation and download failures.
44
+
7. Tool's *lug-n-play architecture that helps to introduce new stats with WebAssembly Toolkit / SDK in JSON existing stats format for future enhancements.
49
45
50
46
## WebAssembly usage
51
47
@@ -73,7 +69,7 @@ We find that WebAssembly adoption has grown from 0.04% in 2021, although rates h
73
69
description="Bar chart showing distribution of page ranking groups from 1000, 10,000, 100000, 1000000, 10000000 and all on client requests for desktop and mobile",
@@ -83,7 +79,6 @@ Adoption rates decrease as site rank declines, following a consistent distributi
83
79
84
80
While desktop usage remains higher in the top ranking groups, the gap narrows significantly in the long tail, suggesting that for the majority of the web, WebAssembly is deployed as a cross-platform resource rather than being restricted to specific environments.
85
81
86
-
87
82
## WebAssembly requests
88
83
89
84
{{ figure_markup(
@@ -96,12 +91,10 @@ While desktop usage remains higher in the top ranking groups, the gap narrows si
96
91
)
97
92
}}
98
93
99
-
100
94
Overall, we recorded 303,496 WebAssembly requests on desktop and 308,971 on mobile. Although more desktop sites utilize WebAssembly, the total volume of requests is slightly higher on mobile.
101
95
102
96
Furthermore, we identified 157,967 unique URLs on desktop and 165,870 on mobile. To estimate the number of unique binaries, we grouped modules by identical filename and response size. Using this method, we found 87,596 unique Wasm modules on desktop and 84,851 on mobile. These findings indicate that by name approximately 72% of WebAssembly requests serve duplicate modules, highlighting substantial reuse of libraries across the web.
103
97
104
-
105
98
### MIME type
106
99
107
100
{{ figure_markup(
@@ -118,7 +111,6 @@ Furthermore, we identified 157,967 unique URLs on desktop and 165,870 on mobile.
118
111
119
112
The `application/wasm` MIME type was identified in 293,470 desktop and 301,127 mobile requests. Instances of missing or incorrect MIME types (such as `text/html` or `text/plain`) were low, affecting 3.2% of desktop and 2.4% of mobile requests. These represent a significant decline compared to 2021, indicating improved awareness and adherence to proper server configuration.
120
113
121
-
122
114
### Module size
123
115
124
116
WebAssembly module sizes vary drastically based on their specific use cases. We observed that the bottom 50% of modules are quite small, ranging between 2 KB and 14 KB. These are typically "micro-utilities" like Base64 encoders or checksum calculators, often written in AssemblyScript or Rust to handle performance-critical tasks where JavaScript lacks precision.
@@ -135,7 +127,7 @@ Conversely, at the 90th percentile, sizes increase significantly to 381 KB on de
135
127
)
136
128
}}
137
129
138
-
The above chart shows the size of response body size, It is often called as "raw response size" that measures only the raw, often decoded -- the data payload that client received. It represents the size of the resource itself. However as per the research and common practices for Wasm deliverables, Wasm modules are compressed and optimized with various tools like [Brotli](https://github.com/google/brotli) and also transfered over network to the client with compression methods like gzip, br, zstd along with Content-Encoding headers.
130
+
The above chart shows the size of response body size, It is often called as "raw response size" that measures only the raw, often decoded—the data payload that client received. It represents the size of the resource itself. However as per the research and common practices for Wasm deliverables, Wasm modules are compressed and optimized with various tools like [Brotli](https://github.com/google/brotli) and also transfered over network to the client with compression methods like gzip, br, zstd along with Content-Encoding headers.
139
131
140
132
{{ figure_markup(
141
133
image="compression-methods-desktop-client.png",
@@ -161,7 +153,7 @@ Interestingly, If we see [performance benchmarks](https://facebook.github.io/zst
Beyond these standard distributions, the dataset contains significant outliers. The largest single WebAssembly module identified measured 233.6 MB on desktop and 170.4 MB on mobile, indicating the deployment of large-scale client-side applications.
172
+
Beyond these standard distributions, the dataset contains significant outliers. The largest single WebAssembly module identified measured 234 MB on desktop and 170 MB on mobile, indicating the deployment of large-scale client-side applications.
181
173
182
174
Interestingly If we think about JS deliverables are in MB size often but Wasm deliverables are in quit smaller size this is because JS is the human readable, high level source code, while bytecode is a low level, intermediate representation of the code that is machine agnostic.
0 commit comments