cygwin 中 bash 的加载时间很慢
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15536212/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Slow load time of bash in cygwin
提问by Forethinker
At the moment bash takes about 2 seconds to load. I have ran bash with -xflag and I am seeing the output and it seems as though PATH is being loaded many times in cygwin. The funny thing is I use the same file in linux environment, but it works fine, without the reload problem. Could the following cause the problem?
目前 bash 需要大约 2 秒的时间来加载。我用-x标志运行了 bash,我看到了输出,似乎 PATH 在 cygwin 中被加载了很多次。有趣的是我在 linux 环境中使用了相同的文件,但它工作正常,没有重新加载问题。以下可能会导致问题吗?
if [ `uname -o` = "Cygwin" ]; then
....
fi
回答by me_and
As you've noted in your answer, the problem is Cygwin's bash-completion package. The quick and easy fix is to disable bash-completion, and the correct way to do that is to run Cygwin's setup.exe (download it againif you need to) and select to uninstall that package.
正如您在回答中所指出的,问题在于 Cygwin 的 bash-completion 包。快速简便的修复方法是禁用 bash 完成,正确的方法是运行 Cygwin 的 setup.exe(如果需要,请再次下载)并选择卸载该软件包。
The longer solution is to work through the files in /etc/bash_completion.dand disable the ones you don't need. On my system, the biggest culprits for slowing down Bash's load time (mailman, shadow, dsniff and e2fsprogs) all did exactly nothing, since the tools they were created to complete weren't installed.
更长的解决方案是处理其中的文件/etc/bash_completion.d并禁用您不需要的文件。在我的系统上,减慢 Bash 加载时间的最大罪魁祸首(邮递员、影子、dsniff 和 e2fsprogs)都没有做任何事情,因为没有安装为完成而创建的工具。
If you rename a file in /etc/bash_completion.dto have a .bakextension, it'll stop that script being loaded. Having disabled all but a select 37 scripts on one of my systems in that manner, I've cut the average time for bash_completion to load by 95% (6.5 seconds to 0.3 seconds).
如果您将文件重命名/etc/bash_completion.d为具有.bak扩展名,它将停止加载该脚本。以这种方式在我的一个系统上禁用了除选定 37 个脚本之外的所有脚本后,我将 bash_completion 的平均加载时间缩短了 95%(6.5 秒到 0.3 秒)。
回答by npe
In my case that was windows domain controller. I did this to find the issue:
就我而言,那是 Windows 域控制器。我这样做是为了找到问题:
I started with a simple, windows cmd.exeand the, typed this:c:\cygwin\bin\strace.exe c:\cygwin\bin\bash
我从一个简单的 windows 开始,cmd.exe然后输入:c:\cygwin\bin\strace.exe c:\cygwin\bin\bash
In my case, I noticed a following sequence:
就我而言,我注意到以下顺序:
218 12134 [main] bash 11304 transport_layer_pipes::connect: Try to connect to named pipe: \.\pipe\cygwin-c5e39b7a9d22bafb-lpc
45 12179 [main] bash 11304 transport_layer_pipes::connect: Error opening the pipe (2)
39 12218 [main] bash 11304 client_request::make_request: cygserver un-available
1404719 1416937 [main] bash 11304 pwdgrp::fetch_account_from_windows: line: <CENSORED_GROUP_ID_#1>
495 1417432 [main] bash 11304 pwdgrp::fetch_account_from_windows: line: <CENSORED_GROUP_ID_#2>
380 1417812 [main] bash 11304 pwdgrp::fetch_account_from_windows: line: <CENSORED_GROUP_ID_#3>
etc...
The key thing was identifying the client_request::make_request: cygserver un-availableline. You can see, how after that, cygwin tries to fetch every single group from windows, and execution times go crazy.
关键是确定client_request::make_request: cygserver un-available线路。你可以看到,在那之后,cygwin 尝试从 Windows 中获取每个组,并且执行时间变得疯狂。
A quick google revealed what a cygserveris:
https://cygwin.com/cygwin-ug-net/using-cygserver.html
一个快速的谷歌揭示了 acygserver是什么:https:
//cygwin.com/cygwin-ug-net/using-cygserver.html
Cygserver is a program which is designed to run as a background service. It provides Cygwin applications with services which require security arbitration or which need to persist while no other cygwin application is running.
Cygserver 是一个旨在作为后台服务运行的程序。它为 Cygwin 应用程序提供需要安全仲裁或需要在没有其他 cygwin 应用程序运行时持续存在的服务。
The solution was, to run the cygserver-configand then net start cygserverto start the Windows service. Cygwin startup times dropped significantly after that.
解决方案是,运行cygserver-config然后net start cygserver启动 Windows 服务。之后 Cygwin 启动时间显着下降。
回答by Gene Pavlovsky
All of the answers refer to older versions of bash_completion, and are irrelevant for recent bash_completion.
所有答案都参考了较旧版本的 bash_completion,与最近的bash_completion.
Modern bash_completion moved most of the completion files to /usr/share/bash-completion/completionsby default, check the path on your system by running
现代 bash_completion 将大部分完成文件移动到/usr/share/bash-completion/completions默认情况下,通过运行检查系统上的路径
# pkg-config --variable=completionsdir bash-completion
/usr/share/bash-completion/completions
There are many files in there, one for each command, but that is not a problem, since they are loaded on demand the first time you use completion with each command. The old /etc/bash_completion.dis still supported for compatibility, and all files from there are loaded when bash_completionstarts.
那里有很多文件,每个命令一个,但这不是问题,因为它们是在您第一次对每个命令使用完成时按需加载的。旧/etc/bash_completion.d的仍然支持兼容性,并且在bash_completion启动时加载那里的所有文件。
# pkg-config --variable=compatdir bash-completion
/etc/bash_completion.d
Use this script to check if there are any stale files left in the old dir.
使用此脚本检查旧目录中是否有任何陈旧文件。
#!/bin/sh
COMPLETIONS_DIR="$(pkg-config --variable=completionsdir bash-completion)"
COMPAT_DIR="$(pkg-config --variable=compatdir bash-completion)"
for file in "${COMPLETIONS_DIR}"/*; do
file="${COMPAT_DIR}/${file#${COMPLETIONS_DIR}/}"
[ -f "$file" ] && printf '%s\n' $file
done
It prints the list of files in compat dir that are also present in the newer (on-demand) completions dir. Unless you have specific reasons to keep some of them, review, backup and remove all of those files.
它打印 compat 目录中的文件列表,这些文件也存在于较新的(按需)完成目录中。除非您有特殊原因需要保留其中一些文件,否则请查看、备份和删除所有这些文件。
As a result, the compat dir should be mostly empty.
因此,compat 目录应该大部分是空的。
Now, for the most interesting part - checking why bashstartup is slow.
If you just run bash, it will start a non-login, interactiveshell - this one on Cygwin source /etc/bash.bashrcand then ~/.bashrc. This most likely doesn't include bash completion, unless you source it from one of rc files. If you run bash -l(bash --login), start Cygwin Terminal(depends on your cygwin.bat), or log in via SSH, it will start a login, interactiveshell - which will source /etc/profile, ~/.bash_profile, and the aforementioned rc files. The /etc/profilescript itself sources all executable .shfiles in /etc/profile.d.
现在,对于最有趣的部分 - 检查bash启动缓慢的原因。如果您只运行bash,它将启动一个非登录的交互式shell——这个是在 Cygwin 源代码上的/etc/bash.bashrc,然后是~/.bashrc. 这很可能不包括 bash 完成,除非您从 rc 文件之一获取它。如果你运行bash -l(bash --login),启动Cygwin Terminal(取决于你cygwin.bat),或登录通过SSH,就会启动一个登录,互动的外壳-这将输出/etc/profile,~/.bash_profile和上述RC文件。该/etc/profile脚本本身来源的所有可执行.sh文件中/etc/profile.d。
You can check how long each file takes to source. Find this code in /etc/profile:
您可以检查每个文件获取源所需的时间。在/etc/profile以下位置找到此代码:
for file in /etc/profile.d/*.; do
[ -e "${file}" ] && . "${file}"
done
Back it up, then replace it with this:
备份它,然后用这个替换它:
for file in /etc/profile.d/*.; do
TIMEFORMAT="%3lR ${file}"
[ -e "${file}" ] && time . "${file}"
done
Start bashand you will see how long each file took. Investigate files that take a significant amount of time. In my case, it was bash_completion.shand fzf.sh(fzf is fuzzy finder, a really nice complement to bash_completion). Now the choice is to disable it or investigate further. Since I wanted to keep using fzfshortcuts in bash, I investigated, found the source of the slowdown, optimized it, and submitted my patch to fzf's repo (hopefully it will be accepted).
开始bash,您将看到每个文件花费了多长时间。调查需要大量时间的文件。就我而言,它是bash_completion.sh和fzf.sh(fzf 是模糊查找器,是 bash_completion 的一个很好的补充)。现在的选择是禁用它或进一步调查。由于我想继续fzf在 bash 中使用快捷方式,因此我进行了调查,找到了速度变慢的根源,对其进行了优化,并将我的补丁提交给了 fzf 的 repo(希望它会被接受)。
Now for the biggest time spender - bash_completion.sh. Basically that script sources /usr/share/bash-completion/bash_completion. I backed up that file, then edited it. On the last page there is forloop that sources all the files in compatdir - /etc/bash_completion.d. Again, I added TIMEFORMATand time, and saw which script was causing the slow starting. It was zzz-fzf(fzfpackage). I investigated and found a subshell ($()) being executed multiple times in a forloop, rewrote that part without using a subshell, making the script work quickly. I already submitted my patch to fzf's repo.
现在是最大的时间花费 - bash_completion.sh。基本上那个脚本来源/usr/share/bash-completion/bash_completion。我备份了那个文件,然后编辑了它。在最后一页上有一个for循环,可以获取compatdir - 中的所有文件/etc/bash_completion.d。再次,我添加了TIMEFORMAT和time,并查看了哪个脚本导致启动缓慢。它是zzz-fzf(fzf包)。我一查,发现一个子shell()$()在被执行多次for循环,改写了不使用子shell的那部分,使脚本工作迅速。我已经将我的补丁提交给了 fzf 的 repo。
The biggest reason for all these slowdowns is: forkis not supported by Windows process model, Cygwin did a great job emulating it, but it's painfully slow compared to a real UNIX. A subshell or a pipeline that does very little work by itself spends most of it's execution time for fork-ing. E.g. compare the execution times of time echo msg(0.000s on my Cygwin) vs time echo $(echo msg)(0.042s on my Cygwin) - day and night. The echocommand itself takes no appreciable time to execute, but creating a subshell is very expensive. On my Linux system, these commands take 0.000s and 0.001s respectively. Many packages Cygwin has are developed by people who use Linux or other UNIX, and can run on Cygwin unmodified. So naturally these devs feel free to use subshells, pipelines and other features wherever convenient, since they don't feel any significant performance hit on their system, but on Cygwin those shell scripts might run tens and hundreds of times slower.
所有这些变慢的最大原因是:fork不受 Windows 进程模型支持,Cygwin 在模拟它方面做得很好,但与真正的 UNIX 相比,它慢得令人痛苦。一个子shell或一个自己做很少工作的管道将大部分执行时间花在fork-ing上。例如,比较time echo msg(我的 Cygwin 上的 0.000 秒)与time echo $(echo msg)(我的 Cygwin 上的 0.042 秒)的执行时间——白天和黑夜。这echocommand 本身不需要很长的时间来执行,但是创建一个子 shell 是非常昂贵的。在我的 Linux 系统上,这些命令分别需要 0.000s 和 0.001s。Cygwin 的许多软件包是由使用 Linux 或其他 UNIX 的人开发的,并且可以不加修改地在 Cygwin 上运行。因此,这些开发人员很自然地可以在任何方便的地方随意使用子 shell、管道和其他功能,因为他们不会觉得系统性能受到任何显着影响,但在 Cygwin 上,这些 shell 脚本的运行速度可能会慢成百上千倍。
Bottom line, if a shell script works slowly in Cygwin - try to locate the source of forkcalls and rewrite the script to eliminate them as much as possible.
E.g. cmd="$(printf "$1" "$2")"(uses one fork for subshell) can be replaced with printf -v cmd "$1" "$2".
最重要的是,如果 shell 脚本在 Cygwin 中运行缓慢 - 尝试定位fork调用源并重写脚本以尽可能消除它们。例如cmd="$(printf "$1" "$2")"(使用一个叉子作为子shell)可以替换为printf -v cmd "$1" "$2".
Boy, it came out really long. Any people still reading up to here are real heros. Thanks :)
男孩,它出来的时间真的很长。任何仍在阅读到这里的人都是真正的英雄。谢谢 :)
回答by grocky
I know this is an old thread, but after a fresh install of Cygwin this week I'm still having this problem.
我知道这是一个旧线程,但是在本周全新安装 Cygwin 之后,我仍然遇到这个问题。
Instead of handpicking all of the bash_completion files, I used this line to implement @me_and's approach for anything that isn't installed on my machine. This significantly reduced the startup time of bash for me.
我没有手动选择所有 bash_completion 文件,而是使用这一行来为我的机器上未安装的任何内容实现 @me_and 的方法。这对我来说大大减少了 bash 的启动时间。
In /etc/bash_completion.d, execute the following:
在 中/etc/bash_completion.d,执行以下操作:
for i in $(ls|grep -v /); do type $i >/dev/null 2>&1 || mv $i $i.bak; done
回答by MCK
New answer for an old thread, relating to the PATHof the original question.
旧线程的新答案,与PATH原始问题的 相关。
Most of the other answers deal with the bash startup. If you're seeing a slow load time when you run bash -iwithin the shell, those may apply.
大多数其他答案都与 bash 启动有关。如果您在bash -ishell 中运行时发现加载时间很慢,那么这些可能适用。
In my case, bash -iran fast, but anytime I opened a new shell (be it in a terminal or in xterm), it took a really long time. If bash -lis taking a long time, it means it's the login time.
在我的情况下,bash -i运行速度很快,但是无论何时我打开一个新 shell(无论是在终端中还是在 xterm 中),都需要很长时间。如果bash -l需要很长时间,这意味着它是登录时间。
There are some approaches at the Cygwin FAQ at https://cygwin.com/faq/faq.html#faq.using.startup-slowbut they didn't work for me.
在https://cygwin.com/faq/faq.html#faq.using.startup-slow的 Cygwin 常见问题解答中有一些方法,但它们对我不起作用。
The original poster asked about the PATH, which he diagnosed using bash -x. I too found that although bash -iwas fast, bash -xlwas slow and showed a lot of information about the PATH.
原发帖者询问了PATH,他诊断使用bash -x。我也发现它虽然bash -i很快,但bash -xl很慢,并且显示了很多关于PATH.
There was such a ridiculously long Windows PATHthat the login process kept on running programs and searching the entire PATHfor the right program.
WindowsPATH的时间长得可笑,以至于登录过程一直在运行程序并在整个过程中搜索PATH正确的程序。
My solution: Edit the Windows PATHto remove anything superfluous. I'm not sure which piece I removed that did the trick, but the login shell startup went from 6 seconds to under 1 second.
我的解决方案:编辑 WindowsPATH以删除任何多余的内容。我不确定我删除了哪一部分可以解决问题,但是登录 shell 启动时间从 6 秒缩短到 1 秒以下。
YMMV.
天啊。
回答by eresonance
I'm on a corporate network with a pretty complicated setup, and it seems that really kills cygwin startup times. Related to npe's answer, I also had to follow some of the steps laid out here: https://cygwin.com/faq/faq.html#faq.using.startup-slow
我在一个设置非常复杂的公司网络上,这似乎真的会缩短 cygwin 的启动时间。与 npe 的回答相关,我还必须遵循此处列出的一些步骤:https://cygwin.com/faq/faq.html#faq.using.startup-slow
Another cause for AD client system is slow DC replies, commonly observed in configurations with remote DC access. The Cygwin DLL queries information about every group you're in to populate the local cache on startup. You may speed up this process a little by caching your own information in local files. Run these commands in a Cygwin terminal with write access to /etc:
getent passwd $(id -u) > /etc/passwdgetent group $(id -G) > /etc/groupAlso, set
/etc/nsswitch.confas follows:
passwd: files dbgroup: files dbThis will limit the need for Cygwin to contact the AD domain controller (DC) while still allowing for additional information to be retrieved from DC, such as when listing remote directories.
AD 客户端系统的另一个原因是 DC 响应缓慢,通常在具有远程 DC 访问的配置中观察到。Cygwin DLL 查询有关您所在的每个组的信息,以在启动时填充本地缓存。您可以通过在本地文件中缓存您自己的信息来稍微加快此过程。在具有对 /etc 的写访问权限的 Cygwin 终端中运行这些命令:
getent passwd $(id -u) > /etc/passwdgetent group $(id -G) > /etc/group另外,设置
/etc/nsswitch.conf如下:
passwd: files dbgroup: files db这将限制 Cygwin 联系 AD 域控制器 (DC) 的需要,同时仍允许从 DC 检索其他信息,例如列出远程目录时。
After doing that plus starting the cygserver my cygwin startup time dropped significantly.
这样做并启动 cygserver 后,我的 cygwin 启动时间显着下降。
回答by Nikolay Mihaylov
My answer is the same as npe's above. But, since I just joined, I cannot comment or even upvote it! I hope this post doesn't get deleted because it offer reassurance for anyone looking for an answer to the same problem.
我的回答和上面npe的一样。但是,因为我刚加入,我无法评论甚至点赞!我希望这篇文章不会被删除,因为它为寻找同一问题答案的任何人提供了保证。
npe's solution worked for me. There's only one caveat - I had to close all cygwin processes before I got the best out of it. That includes running cygwin services, like sshd, and the ssh-agent that I start from my login scripts. Before that, the window for the cygwin terminal would appear instantly but hang for several seconds before it presents the prompt. And it hanged for several seconds upon closing the window. After I killed all processes and started the cygserver service (btw I prefer to use the Cygwin way - 'cygrunsrv -S cygserver', than 'net start cygserver'; I don't know if it makes any practical difference) it starts immediately. So thanks to npe again!
npe 的解决方案对我有用。只有一个警告 - 在我充分利用它之前,我必须关闭所有 cygwin 进程。这包括运行 cygwin 服务,如 sshd,以及我从登录脚本启动的 ssh-agent。在此之前,cygwin 终端的窗口会立即出现,但在出现提示之前会挂起几秒钟。关上窗户后,它挂了几秒钟。在我杀死所有进程并启动 cygserver 服务后(顺便说一句,我更喜欢使用 Cygwin 方式 - 'cygrunsrv -S cygserver',而不是 'net start cygserver';我不知道它是否有任何实际区别)它立即启动。所以再次感谢npe!
回答by Howard Gong
As someone mentioned above, one possible issue is the PATH environment variable contains too much path, cygwin will search all of them. I prefer direct edit the /etc/profile, just overwrite the PATH variable to cygwin related path, e.g. PATH="/usr/local/bin:/usr/bin". Add additional path if you want.
正如上面提到的,一个可能的问题是 PATH 环境变量包含太多路径,cygwin 将搜索所有路径。我更喜欢直接编辑 /etc/profile,只需将 PATH 变量覆盖到 cygwin 相关路径,例如PATH="/usr/local/bin:/usr/bin". 如果需要,请添加其他路径。
回答by Bastian
I wrote a Bash function named 'minimizecompletion' for inactivating not needed completion scripts.
我编写了一个名为“minimizecompletion”的 Bash 函数,用于停用不需要的完成脚本。
Completion scripts can add more than one completion specification or have completion specifications for shell buildins, therefore it is not sufficient to compare script names with executable files found in $PATH.
完成脚本可以添加多个完成规范或具有 shell 构建的完成规范,因此将脚本名称与 $PATH 中找到的可执行文件进行比较是不够的。
My solution is to remove all loaded completion specifications, to load a completion script and check if it has added new completion specifications. Depending on this it is inactivated by adding .bak to the script file name or it is activated by removing .bak. Doing this for all 182 scripts in /etc/bash_completion.d results in 36 active and 146 inactive completion scripts reducing the Bash start time by 50% (but it should be clear this depends on installed packages).
我的解决方案是删除所有加载的完成规范,加载完成脚本并检查它是否添加了新的完成规范。根据这一点,它可以通过将 .bak 添加到脚本文件名来取消激活,或者通过删除 .bak 来激活。对 /etc/bash_completion.d 中的所有 182 个脚本执行此操作会导致 36 个活动和 146 个非活动完成脚本将 Bash 启动时间减少 50%(但应该清楚这取决于已安装的软件包)。
The function also checks inactivated completion scripts so it can activate them when they are needed for new installed Cygwin packages. All changes can be undone with argument -a that activates all scripts.
该函数还检查未激活的完成脚本,以便在新安装的 Cygwin 软件包需要它们时激活它们。可以使用激活所有脚本的参数 -a 撤消所有更改。
# Enable or disable global completion scripts for speeding up Bash start.
#
# Script files in directory '/etc/bash_completion.d' are inactived
# by adding the suffix '.bak' to the file name; they are activated by
# removing the suffix '.bak'. After processing all completion scripts
# are reloaded by calling '/etc/bash_completion'
#
# usage: [-a]
# -a activate all completion scripts
# output: statistic about total number of completion scripts, number of
# activated, and number of inactivated completion scripts; the
# statistic for active and inactive completion scripts can be
# wrong when 'mv' errors occure
# return: 0 all scripts are checked and completion loading was
# successful; this does not mean that every call of 'mv'
# for adding or removing the suffix was successful
# 66 the completion directory or loading script is missing
#
minimizecompletion() {
local arg_activate_all=${1-}
local completion_load=/etc/bash_completion
local completion_dir=/etc/bash_completion.d
(
# Needed for executing completion scripts.
#
local UNAME='Cygwin'
local USERLAND='Cygwin'
shopt -s extglob progcomp
have() {
unset -v have
local PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin"
type -- "" &>/dev/null && have='yes'
}
# Print initial statistic.
#
printf 'Completion scripts status:\n'
printf ' total: 0\n'
printf ' active: 0\n'
printf ' inactive: 0\n'
printf 'Completion scripts changed:\n'
printf ' activated: 0\n'
printf ' inactivated: 0\n'
# Test the effect of execution for every completion script by
# checking the number of completion specifications after execution.
# The completion scripts are renamed depending on the result to
# activate or inactivate them.
#
local completions total=0 active=0 inactive=0 activated=0 inactivated=0
while IFS= read -r -d '' f; do
((++total))
if [[ $arg_activate_all == -a ]]; then
[[ $f == *.bak ]] && mv -- "$f" "${f%.bak}" && ((++activated))
((++active))
else
complete -r
source -- "$f"
completions=$(complete | wc -l)
if (( $completions > 0 )); then
[[ $f == *.bak ]] && mv -- "$f" "${f%.bak}" && ((++activated))
((++active))
else
[[ $f != *.bak ]] && mv -- "$f" "$f.bak" && ((++inactivated))
((++inactive))
fi
fi
# Update statistic.
#
printf '\r\e[6A\e[15C%s' "$total"
printf '\r\e[1B\e[15C%s' "$active"
printf '\r\e[1B\e[15C%s' "$inactive"
printf '\r\e[2B\e[15C%s' "$activated"
printf '\r\e[1B\e[15C%s' "$inactivated"
printf '\r\e[1B'
done < <(find "$completion_dir" -maxdepth 1 -type f -print0)
if [[ $arg_activate_all != -a ]]; then
printf '\nYou can activate all scripts with %s.\n' "'$FUNCNAME -a'"
fi
if ! [[ -f $completion_load && -r $completion_load ]]; then
printf 'Cannot reload completions, missing %s.\n' \
"'$completion_load'" >&2
return 66
fi
)
complete -r
source -- "$completion_load"
}
This is an example output and the resulting times:
这是一个示例输出和结果时间:
$ minimizecompletion -a
Completion scripts status:
total: 182
active: 182
inactive: 0
Completion scripts changed:
activated: 146
inactivated: 0
$ time bash -lic exit
logout
real 0m0.798s
user 0m0.263s
sys 0m0.341s
$ time minimizecompletion
Completion scripts status:
total: 182
active: 36
inactive: 146
Completion scripts changed:
activated: 0
inactivated: 146
You can activate all scripts with 'minimizecompletion -a'.
real 0m17.101s
user 0m1.841s
sys 0m6.260s
$ time bash -lic exit
logout
real 0m0.422s
user 0m0.092s
sys 0m0.154s

