-
-
Notifications
You must be signed in to change notification settings - Fork 415
Description
By default, Hyperfine will attach Stdio::null()
to the stdout of the command it runs. Some programs, like greps, will detect this, alter how they execute and run more quickly as a result. For example, in the case of GNU grep, if it detects that stdout is /dev/null
, then it will behave as if the -q/--quiet
flag were present. This means GNU grep can exit as soon as a match is found. This is a perfectly legitimate optimization since its only observable behavior is its exit code, and its exit code is only influenced by whether a match exists or not (assuming no errors or interrupts occur).
What this means is that, e.g., time grep foo file | wc -l
and hyperfine 'grep foo file'
aren't quite doing the same thing. That's no fault of Hyperfine, however, it would be nice to have a way to easily work around it. As of today, here are some work-arounds:
- Use the
--show-output
flag, which captures stdout. But this also prints stdout, which can be undesirable if there is a lot of output. - In the case of grep specifically, use a query that is not expected to match and give Hyperfine the
--ignore-failure
flag.
A better work-around might be to have some other flag, maybe --capture-output
, that causes Hyperfine to capture stdout but then do nothing with it.
I was motivated to write this feature request based on an errant benchmark found in the wild: https://old.reddit.com/r/commandline/comments/mibsw8/alternative_to_grep_less/gt90lmm/