2017-09-08 69 views
5

Używam testu porównawczego google w Xcode i z jakiegoś powodu produkuję kolorowy wydruk. Ponieważ Xcode nie obsługuje kolorów wyjściowych, widzę niepożądane symbole. Zastanawiam się, czy można wymusić wyjście czarno-białe w benchmarku google. Preferuję odpowiedzi korzystające z ich API, ale jestem otwarty na inne alternatywy.Jak wymusić wydruk czarno-biały w benchmarku google

+2

próbowałeś po parametr --benchmark_color = {auto | true | false}? –

+0

Świetnie! to działa. Czy wiesz, czy istnieje sposób na określenie tego z CMake? @ArtemyVysotsky – German

+1

Aby zastosować właściwą sugestię @Artemy Vysotsky, możesz utworzyć skrypt, który wywoła plik wykonywalny testu wydajności z poprawnym parametrem. Możesz nawet zlecić ten plik kontroli wersji, a następnie skopiować go do katalogu kompilacji. Zobacz polecenie cmake [plik_konfiguracyjny] (https://cmake.org/cmake/help/latest/command/configure_file.html) –

Odpowiedz

2

wyjście Kolor Google Benchmark jest wymieniony w ich Readme: https://github.com/google/benchmark#output-formats

formatów wyjściowych

Biblioteka obsługuje wiele formatów wyjściowych. Użyj flagi --benchmark_format=<console|json|csv>, aby ustawić typ formatu. konsola jest domyślnym formatem.

Format konsoli ma być czytelny dla człowieka. Według domyślny format generuje wydruki kolorowe. Kontekst jest wyprowadzany na stderr i dane tabelaryczne na standardowe wyjście.

Istnieje również możliwość zapisywania non-kolorową kopię wyjście do pliku z --benchmark_out=file --benchmark_out_format=console (domyślnie json)

Biblioteka obsługuje pisanie wyjście odniesienia do pliku określonym przez --benchmark_out=<filename>. Format pliku wyjściowego może być określony jako przy użyciu --benchmark_out_format={json|console|csv}. Określanie --benchmark_out nie tłumi wyjścia konsoli.

A w realizacji mają flagę wyłączyć kolorowanie konsoli:

https://github.com/google/benchmark/blob/a271c36af93c7a3b19dfeb2aefa9ca77a58e52e4/src/benchmark.cc#L87

DEFINE_string(benchmark_color, "auto", 
      "Whether to use colors in the output. Valid values: " 
      "'true'/'yes'/1, 'false'/'no'/0, and 'auto'. 'auto' means to use " 
      "colors if the output is being sent to a terminal and the TERM " 
      "environment variable is set to a terminal type that supports " 
      "colors."); 

Więc można use --benchmark_color=false as suggested by Artemy (przy użyciu skryptu wrapper shell) lub spróbuj przejść wyjścia konsoli z " bezużyteczny wzór kota ":

./program | cat 

Należy ustawić stdout to fail isatty() check w domyślnym trybie automatycznym kolorów (ta sztuczka działa, aby wyłączyć kolor grep).

stonie TERM env zmienną export TERM=ansi, aby wskazać, że masz zielono-czarny monitora CRT: https://github.com/google/benchmark/blob/09b93ccc6a9aed84c269b6f5b8130c878e518ebb/src/colorprint.cc#L167

//     ... This list of 
    // supported TERM values is copied from Google Test: 
    // <https://github.com/google/googletest/blob/master/googletest/src/gtest.cc#L2925>. 
    const char* const SUPPORTED_TERM_VALUES[] = { 
     "xterm",   "xterm-color",  "xterm-256color", 
     "screen",  "screen-256color", "tmux", 
     "tmux-256color", "rxvt-unicode", "rxvt-unicode-256color", 
     "linux",   "cygwin", 
}; 

ale z |cat i export TERM=ansi gbench nadal generuje kolor. To musi być błąd (!!!) blisko GetOutputOptions, co IsColorTerminal() Logiczny A noop w przypadku "auto", więc tryb "auto" nie jest to auto zawsze jest umożliwienie:

ConsoleReporter::OutputOptions GetOutputOptions(bool force_no_color) { 
    int output_opts = ConsoleReporter::OO_Defaults; 
    if ((FLAGS_benchmark_color == "auto" && IsColorTerminal()) || 
     IsTruthyFlagValue(FLAGS_benchmark_color)) { 
    output_opts |= ConsoleReporter::OO_Color; 
    } else { 
    output_opts &= ~ConsoleReporter::OO_Color; 
} 

IsTruthyFlagValue uważa wartość domyślną "auto" za prawdziwą i zawsze włącza wyjście kolorowe, nawet jeśli terminal jej nie obsługuje!

bool IsTruthyFlagValue(const std::string& value) { 
    if (value.empty()) return true; 
    char ch = value[0]; 
    return isalnum(ch) && 
     !(ch == '0' || ch == 'f' || ch == 'F' || ch == 'n' || ch == 'N'); 
} 

Oto łata włączyć tryb automatyczny (będzie pracować z |cat i TERM=ansi ./program i zapewne z jakimiś IDE, które poprawnie ustawia TERM), spadał swobodnie zrobić prośba przyciąganie:

--- a/src/benchmark.cc 
+++ b/src/benchmark.cc 
@@ -555,7 +555,8 @@ bool IsZero(double n) { 
ConsoleReporter::OutputOptions GetOutputOptions(bool force_no_color) { 
    int output_opts = ConsoleReporter::OO_Defaults; 
    if ((FLAGS_benchmark_color == "auto" && IsColorTerminal()) || 
-  IsTruthyFlagValue(FLAGS_benchmark_color)) { 
+  (FLAGS_benchmark_color != "auto" && 
+  IsTruthyFlagValue(FLAGS_benchmark_color))) { 
    output_opts |= ConsoleReporter::OO_Color; 
    } else { 
    output_opts &= ~ConsoleReporter::OO_Color; 
+1

Błąd wprowadzony w wersji 1.2.0 przez 0de985ae9d4ea1582125a5414a99ca90c368ca10 https://github.com/google/benchmark/commit/0de985ae9d4ea1582125a5414a99ca90c368ca10 commit (biojppm Joao Paulo Magalhaes popełnione 2 marca 2017 roku) - stara logika polegała na użyciu IsTruthyFlagValue tylko wtedy, gdy opcja koloru nie jest automatyczny. https://github.com/google/benchmark/commit/0de985ae9d4ea1582125a5414a99ca90c368ca10#diff-5cd986c2288650e5c5d336b92dcfafd1L549 – osgx