Conversion benchmarks: time, CPU and memory
What it costs a server to convert a file: 78 measured cases, the method, and the data as a CSV you may reuse with credit.
In one sentence
An open dataset of 78 measured conversions (PDF, images, OCR, e-books, Office files) with wall time, CPU seconds and peak memory, measured on an Apple M1 Max laptop and an x86 Xeon server.
Key facts
- 78 cases from 8 engines, measured between 2026-10-09 and 2026-10-15; one CSV row per case.
- Only the headless Chromium cases (6 rows) were also measured on the x86 server. There a CPU second per job was 2.3 to 2.7 times the M1 figure for ordinary documents, and 10.8 times for the tallest full-page screenshot.
- Inputs were generated by our own scripts, apart from two public web pages used for the URL cases. No customer files were used.
- The data is licensed CC BY 4.0: copy, share and adapt it, with credit to AIIPWorld and a link to this page.
Sources
- Tesseract OCR documentation
- sharp: resizing images
- qpdf manual
- Poppler PDF rendering library
- calibre e-book converter manual
- VisionCortex: VTracer (raster to vector)
- Apache ECharts documentation
Last reviewed:
Download the data
conversion-benchmarks.csv (78 rows, UTF-8, comma separated, one header row). License: Creative Commons Attribution 4.0. Cite it as:
AIIPWorld, “Conversion benchmarks”, https://aiipworld.com/data/conversion-benchmarks/, CC BY 4.0, measured 2026-10-09 to 2026-10-15.
How it was measured
- M1 Max. An Apple MacBook Pro (M1 Max) running Docker Desktop with arm64 Linux containers. Images, PDF and OCR cases ran one at a time in a fresh container limited to 1 CPU, with a read-only root file system and no privileges; the figure is the median of 3 runs. E-books ran with 2 CPUs and 2 GB, Office files with 1 CPU and 1.5 GB. The Chromium cases ran in a worker limited to 4 CPUs and 4 GB, one job at a time after two warm-up runs.
- r640 x86. A Dell R640 server with two Intel Xeon Gold 6138 processors (2.0 GHz) running the same Chromium worker image, one job at a time. About 80 production containers were running at the time, so these figures include interference and are noisy. Only the Chromium cases were measured here.
- What the columns count. Wall time runs from the worker taking the job to the result being written; queueing, upload and download are not included. CPU seconds come from the container’s cgroup counters and cover every process of the job, including the browser or converter. Memory is a peak, and the memory_metric column names the counter, because browser, container and process-tree peaks are not the same thing and should not be compared across groups.
- Inputs. Logos, illustrations and photo-like images were drawn or synthesised by our scripts; documents, spreadsheets, slide decks and e-books were generated with python-docx, openpyxl, python-pptx and our own text generators; scans are noise-filled JPEG pages. The two URL cases use public web pages, so their times include the internet.
M1 against the x86 server
The six Chromium cases below were measured on both machines. The x86 server needed more CPU for every one of them.
| Case | M1 wall | x86 wall | M1 CPU s | x86 CPU s | CPU ratio |
|---|---|---|---|---|---|
| one-page invoice HTML with CJK and emoji text | 68 ms | 152 ms | 0.14 | 0.36 | 2.6x |
| the same invoice, viewport 900 x 700 | 126 ms | 264 ms | 0.2 | 0.45 | 2.3x |
| 50-page HTML document (text and tables) | 207 ms | 503 ms | 0.32 | 0.85 | 2.7x |
| a minimal public demo web page (the IANA reserved demo domain) (uses the internet) | 163 ms | 213 ms | 0.19 | 0.4 | 2.1x |
| a long public encyclopedia article (24 printed pages with images) (uses the internet) | 597 ms | 1,269 ms | 1.05 | 2.79 | 2.7x |
| the same article, full page, 1280 px wide, cut at 16,384 px (uses the internet) | 1,626 ms | 19.1 s | 2.3 | 24.9 | 10.8x |
Results by engine
Times of 10 seconds or more are shown in seconds. The full precision is in the CSV.
HTML, web pages and screenshots (headless Chromium)
The only group measured on both machines.
Charts (Apache ECharts in headless Chromium)
M1 only.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| typical bar chart, 1200 x 800 to PNG | M1 Max | 518 ms | 0.62 | 228 | 17,892 B | |
| typical histogram to PNG | M1 Max | 445 ms | 0.53 | 228 | 10,247 B | |
| typical box plot to PNG | M1 Max | 359 ms | 0.46 | 224 | 8,057 B | |
| typical scatter plot to PNG | M1 Max | 325 ms | 0.45 | 217 | 28,389 B | |
| typical dot plot to PNG | M1 Max | 309 ms | 0.39 | 219 | 9,557 B | |
| typical stem-and-leaf plot to PNG | M1 Max | 99 ms | 0.14 | 172 | 18,721 B | |
| typical radar chart to PNG | M1 Max | 303 ms | 0.4 | 225 | 51,044 B | |
| largest allowed bar chart: 2000 x 2000 at 2x = 16 MP, 200 categories x 10 series, values shown to PNG | M1 Max | 887 ms | 1.29 | 484 | 1,158,247 B |
Image conversion, resizing and compression (sharp)
M1 only. Each case ran in a fresh container with 1 CPU.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| 1024 x 1024 PNG logo with transparency, WebP quality 80 to WebP | M1 Max | 220 ms | 0.25 | 62 | 37 KB | 13 KB |
| the same logo, JPEG quality 80 to JPEG | M1 Max | 110 ms | 0.15 | 39 | 37 KB | 25 KB |
| 1600 x 1200 flat illustration PNG, lossless WebP to WebP | M1 Max | 230 ms | 0.25 | 95 | 90 KB | 27 KB |
| 2000 x 1500 JPEG photo-like image, WebP quality 80 to WebP | M1 Max | 580 ms | 0.61 | 60 | 775 KB | 529 KB |
| the same JPEG to PNG to PNG | M1 Max | 290 ms | 0.32 | 43 | 775 KB | 7.5 MB |
| 1600 x 1200 WebP to PNG | M1 Max | 150 ms | 0.17 | 52 | 32 KB | 247 KB |
| 4000 x 3000 (12 MP) JPEG, WebP quality 80 to WebP | M1 Max | 1,780 ms | 1.75 | 118 | 2.5 MB | 1.1 MB |
| 12 MP WebP to PNG | M1 Max | 860 ms | 0.9 | 149 | 1.4 MB | 24.9 MB |
| 12 MP JPEG to PNG | M1 Max | 870 ms | 0.88 | 74 | 2.5 MB | 28.5 MB |
| 4096 x 4096 (16 MP) random-noise JPEG, WebP quality 80 (worst-case input) to WebP | M1 Max | 3,450 ms | 3.43 | 307 | 4.3 MB | 8.4 MB |
| 12 MP JPEG (GIF is the most expensive output format) to GIF | M1 Max | 3,800 ms | 3.83 | 182 | 2518 KB | 7320 KB |
| 1024 x 1024 PNG logo to ICO with sizes 16 to 256 to ICO | M1 Max | 240 ms | 0.25 | 44 | 37 KB | 20 KB |
| 12 MP TIFF (JPEG-compressed) to JPEG | M1 Max | 480 ms | 0.5 | 116 | 2273 KB | 1994 KB |
| 1024 x 1024 PNG logo, longest side 256 px to PNG | M1 Max | 110 ms | 0.15 | 39 | 37 KB | 10 KB |
| 2000 x 1500 JPEG, longest side 800 px to JPEG | M1 Max | 130 ms | 0.16 | 43 | 775 KB | 37 KB |
| 12 MP JPEG, longest side 1600 px to JPEG | M1 Max | 220 ms | 0.25 | 64 | 2.5 MB | 225 KB |
| 2000 x 1500 AVIF, longest side 800 px to AVIF input, image output | M1 Max | 310 ms | 0.33 | 88 | 196 KB | 17 KB |
| 12 MP AVIF, longest side 1600 px to AVIF input, image output | M1 Max | 840 ms | 0.87 | 252 | 739 KB | 166 KB |
| 2000 x 1500 JPEG, quality 75 (mozjpeg) to JPEG | M1 Max | 510 ms | 0.53 | 63 | 774 KB | 249 KB |
| 12 MP JPEG, quality 75 to JPEG | M1 Max | 1,640 ms | 1.63 | 154 | 2518 KB | 1054 KB |
| 12 MP JPEG searched down to a 500 KB target (7 encodes) to JPEG | M1 Max | 5,260 ms | 5.24 | 369 | 2518 KB | 498 KB |
| 1024 PNG logo with alpha, palette quantisation quality 75 to PNG | M1 Max | 220 ms | 0.24 | 40 | 37 KB | 8 KB |
| 1600 x 1200 flat illustration PNG, palette quantisation quality 75 to PNG | M1 Max | 200 ms | 0.23 | 49 | 90 KB | 15 KB |
Raster to SVG (VTracer)
M1 only. Wall time only; the CPU column is empty because the BENCH table does not report it.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| 1024 x 1024 transparent PNG logo, 3 colours to SVG | M1 Max | 230 ms | 43 | 37 KB | 16 KB | |
| 512 x 512 single-colour PNG icon to SVG | M1 Max | 140 ms | 41 | 16 KB | 9 KB | |
| 1600 x 1200 flat illustration PNG (about 15 flat colours) to SVG | M1 Max | 540 ms | 77 | 90 KB | 58 KB | |
| 2000 x 1500 generated photo-like JPEG, default settings to SVG | M1 Max | 20.0 s | 453 | 775 KB | 13544 KB | |
| the same photo with the Photo preset (color_precision 5, filter_speckle 16, layer_difference 32) to SVG | M1 Max | 11.1 s | 243 | 775 KB | 1905 KB |
PDF merge, split, rotate, delete and PDF to or from images
M1 only. qpdf, poppler and pdf-lib.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| 10 PDFs of 20 pages each (200 pages) to PDF | M1 Max | 1,570 ms | 1.56 | 28 | 3.0 MB | 0.90 MB |
| 200 + 200 + 5 x 20 pages (500 pages, the signed-in page limit) to PDF | M1 Max | 3,540 ms | 3.51 | 76 | 7.0 MB | 1.80 MB |
| 3 scanned PDFs of 30 full-page JPEG pages (90 pages) to PDF | M1 Max | 17.6 s | 17.45 | 123 | 53.4 MB | 53.39 MB |
| 200 pages into 200 single-page files (ZIP) to ZIP of PDFs | M1 Max | 1,450 ms | 1.45 | 69 | 2.8 MB | 5.71 MB |
| 500 pages into 500 single-page files (ZIP) to ZIP of PDFs | M1 Max | 3,560 ms | 3.56 | 153 | 7.0 MB | 14.24 MB |
| all 200 pages rotated 90 degrees to PDF | M1 Max | 1,790 ms | 1.79 | 73 | 2.8 MB | 2.88 MB |
| all 500 pages rotated 180 degrees to PDF | M1 Max | 4,340 ms | 4.33 | 161 | 7.0 MB | 7.21 MB |
| delete 1 page of 500 to PDF | M1 Max | 3,480 ms | 3.45 | 154 | 7.0 MB | 1.65 MB |
| 1 text page at 150 DPI (2.17 MP) to JPEG | M1 Max | 250 ms | 0.25 | 31 | 0.3 MB | 0.18 MB |
| 100 pages at 150 DPI (217.5 MP in total) to JPEG (ZIP) | M1 Max | 4,840 ms | 4.82 | 70 | 2.8 MB | 23.50 MB |
| 100 pages at 300 DPI (869.6 MP in total) to JPEG (ZIP) | M1 Max | 12.4 s | 12.39 | 141 | 2.8 MB | 61.14 MB |
| 10 pages at 300 DPI (87 MP in total) to PNG (ZIP) | M1 Max | 5,320 ms | 5.28 | 53 | 0.3 MB | 2.49 MB |
| one 12 MP phone photo, fit to page to PDF | M1 Max | 360 ms | 0.35 | 63 | 2.6 MB | 2.59 MB |
| 20 JPEGs of 3 MP, A4 pages (the anonymous limit) to PDF | M1 Max | 390 ms | 0.39 | 115 | 11.5 MB | 11.47 MB |
| one 16.7 MP photo-like PNG with transparency (worst case for one PNG) to PDF | M1 Max | 6,220 ms | 6.22 | 289 | 11.4 MB | 9.98 MB |
Image to text (Tesseract OCR)
M1 only. CPU seconds and memory; per-case wall time was not recorded.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| one dense A4 page of 326 words at 300 dpi (2059 x 2752) to text | M1 Max | 2.55 | 99 | |||
| the same page at 150 dpi (1287 x 1720) to text | M1 Max | 2.05 | 59 | |||
| one 3000 x 2250 phone-style photo of text to text | M1 Max | 2.1 | 113 | |||
| two-page image PDF rendered at 300 dpi to text | M1 Max | 2.64 | 188 |
E-book to PDF (Calibre)
M1 only. Values from the quiet host; a busy host made them up to 2 to 3 times larger.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| small EPUB, 10 KB of text to PDF | M1 Max | 2,700 ms | 0.8 | 143 | 0.24 MB | |
| typical novel EPUB: 0.46 MB of text, 142 pages to PDF | M1 Max | 18.8 s | 4.6 | 652 | 0.76 MB | |
| the same novel as MOBI, 144 pages to PDF | M1 Max | 5,600 ms | 4.0 | 625 | 1.04 MB | |
| the same novel as AZW3, 143 pages to PDF | M1 Max | 19.7 s | 4.5 | 652 | 0.78 MB | |
| EPUB with 1.008 MB of text (at the 1 MB text limit), 283 pages to PDF | M1 Max | 16.1 s | 8.1 | 1227 |
Word, Excel and PowerPoint to PDF (LibreOffice)
M1 only.
| Case | Machine | Wall | CPU s | Peak MB | Input | Output |
|---|---|---|---|---|---|---|
| Word document, 10 sections with pictures, tables and CJK text (480 KB), 20 pages to PDF | M1 Max | 640 ms | 0.57 | 202 | 259 KB | |
| Excel workbook, 3 sheets x 500 rows x 8 columns with formulas (88 KB), 66 pages to PDF | M1 Max | 1,010 ms | 0.92 | 170 | 150 KB | |
| PowerPoint, 20 slides with one picture each (11 MB) to PDF | M1 Max | 1,920 ms | 1.83 | 217 | 4.6 MB | |
| Word document with 100 sections and 200 pages (494 KB) to PDF | M1 Max | 2,590 ms | 2.39 | 224 | 555 KB | |
| PowerPoint, 50 slides of 1600 x 900 noise pictures (61 MB) to PDF | M1 Max | 8,900 ms | 8.5 | 476 | 25.9 MB | |
| Excel workbook, 10 sheets x 5000 rows x 20 columns (10.8 MB, 1 million cells), output capped at 500 pages to PDF | M1 Max | 10.6 s | 10.3 | 243 | 2.3 MB |
What these numbers do not tell you
- They come from synthetic inputs. Real photos traced to SVG, real scanned books and real Office files can be slower; the VTracer rows show how large the gap can be between a logo and a photo-like image.
- They come from one laptop and one shared server. They are not a comparison with other products, and they are not a promise about the response time you will see on aiipworld.com, which also depends on queueing and your network.
- The two machines are different architectures and loads. Do not subtract M1 from x86 figures outside the six paired cases.
- Memory figures use different counters in different groups (see memory_metric).
Columns in the CSV
- id
- Unique case id; the suffix is the machine (-m1 or -r640).
- engine / tool_page / operation
- The software that did the work, the tool page on this site that uses it, and the API operation name.
- input / output_format
- What was converted, and to what.
- platform / statistic / runs
- The machine, how the figure was taken (median or p50), and how many runs it stands for.
- wall_ms / p95_ms
- Time of the job in milliseconds: from the worker taking the job to the result written. Queueing, upload and download are not included. p95 only where the source reports it.
- cpu_seconds
- CPU time used, from the container's cgroup counters (all processes of the job).
- peak_memory_mb / memory_metric
- Peak memory and which counter it is (cgroup memory.peak, browser PSS, or RSS).
- input_size / output_size
- File sizes as reported by the source table, with their units.
- uses_public_internet
- yes when the case fetches a public web page, so network time is in the figure.
- measured_on / source / notes
- Date, the engine benchmark file and section the numbers were copied from, and caveats for that case.
These measurements back the limits and timeouts described on the API documentation and the tools in the tools index. Who runs AIIPWorld and where its numbers come from is on the About page.