From bd06a514d71ec0a1035b425ab77b95d80748c16f Mon Sep 17 00:00:00 2001 From: romkatv Date: Tue, 12 Mar 2019 14:01:20 +0100 Subject: [PATCH] update benchmarks --- README.md | 55 +++++++++++++++++++++++------------------------------ prompt.png | Bin 12434 -> 6142 bytes 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 1c718729..be94ffea 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,10 @@ are still using the `POWERLEVEL9K` prefix though. them with the "dirty" color (yellow by default) whether they are dirty or not. This makes git prompt much faster on huge repositories. + * `POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME (STRING) [default="false"]` + + If set to true, `time` segment will update every second, turning into a realtime clock. + ## Try it out Try Powerlevel10k without making any changes to your setup. If you like it, see @@ -127,64 +131,53 @@ docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -e TERM=$TERM -it --rm ubuntu bash ## How fast is it? -Powerlevel10k renders prompt about 50 times faster than powerlevel9k/master (stable version) and -about 15 times faster than powerlevel9k/next (beta version). +Powerlevel10k renders prompt between 10 and 100 times faster than powerlevel9k. Here are benchmark results obtained with [zsh-prompt-benchmark](https://github.com/romkatv/zsh-prompt-benchmark) on Intel i9-7900X running Ubuntu 18.04. -| Theme | / | ~/nerd-fonts | -|---------------------|----------:|-------------:| -| powerlevel9k/master | 135 ms | 233 ms | -| powerlevel9k/next | 27 ms | 107 ms | -| **powerlevel10k** | **2 ms** | **6 ms** | -| naked zsh | 1 ms | 1 ms | +| Theme | / | ~/linux | +|---------------------|----------:| ---------:| +| powerlevel9k/master | 101 ms | 280 ms | +| powerlevel9k/next | 26 ms | 255 ms | +| **powerlevel10k** | **1 ms** | **22 ms** | +| naked zsh | 0.05 ms | 0.05 ms | Columns define the current directory where the prompt was rendered. * `/` -- root directory, not a git repo. - * `~/nerd-fonts` -- [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) git repo - with 4k files. + * `~/linux` -- [https://github.com/torvalds/linux](https://github.com/torvalds/linux) git repo + with 60k files. It was checked out to an M.2 SSD. + +powerlevel9k/master is the stable branch of powerlevel9k, the one that virtually everyone uses. +powerlevel9k/next is the development branch for the next release. Here's how the prompt looked like during benchmarking. ![](https://raw.githubusercontent.com/romkatv/powerlevel10k/master/prompt.png) It was identical in Powerlevel10k and Powerlevel9k. Even though Powerlevel10k can dynamically -switch to async prompts, it wasn't happening here because latencies were low. Prompts with both -themes were essentially synchronous with every prompt having up-to-date git info. - -_This table used to have another column for Linux kernel git repo, which is massive. It's -been removed because it's not a fair comparison. Powerlevel10k automatically detects that -fetching git status is slow and switches to async prompt generation, which allows it to -achieve 2 ms prompt latency but not all its prompt have up-to-date git info. Those that don't, -have vcs segment greyed out._ +switch to async prompts, it wasn't happening during the benchmark because latencies were low. +Prompts with both themes were essentially synchronous, with every prompt having up-to-date git info +(no greyed-out vcs/git segments). Configuration that was used: ```zsh POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir_writable dir vcs) -POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs time custom_rprompt) +POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status time) POWERLEVEL9K_MODE=nerdfont-complete POWERLEVEL9K_PROMPT_ON_NEWLINE=true -POWERLEVEL9K_CUSTOM_RPROMPT=custom_rprompt -POWERLEVEL9K_ROOT_ICON=\\uF09CPOWERLEVEL9K_TIME_ICON=\\uF017 -POWERLEVEL9K_CUSTOM_RPROMPT_ICON=\\uF005 +POWERLEVEL9K_ROOT_ICON=\\uF09C +POWERLEVEL9K_TIME_ICON=\\uF017 POWERLEVEL9K_TIME_BACKGROUND=magenta -POWERLEVEL9K_CUSTOM_RPROMPT_BACKGROUND=blue POWERLEVEL9K_STATUS_OK_BACKGROUND=grey53 -POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=orange1 -POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=black - -function custom_rprompt() echo -E "hello world" - -sleep 86400 & # spawn two background jobs -sleep 86400 & ``` -Powerlevel10k shows similar performance on Mac OS, FreeBSD, WSL, and Raspberry Pie. +Powerlevel10k shows similar performance advantage over Powerlevel9k on Mac OS, FreeBSD, WSL, and +Raspberry Pie. ## What's the catch? diff --git a/prompt.png b/prompt.png index 0985354aa91fb7143cfbffe0a7bae239bdcb22c3..104b550b5dc93cd08331e367a6e2be9e68ffd897 100644 GIT binary patch literal 6142 zcmb7|XEYq#xBrP2y+<9MAc&r*LG&7oGHMVt2BY^HK}0Vhh~6RwF^FK)M4c!xYA`y{ zGh}pznd|wj|N7sT_ulj3?C;rYoxS&qv(Gu}lV}9grlw%0ARr*1*45E4At1OTeyio~ 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 Xz`ahj*+q_9fKQ;S3Dkh8*~k1B-=im5 literal 12434 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