From 2fffdab34b4287bf19076708d65f158f73a38a77 Mon Sep 17 00:00:00 2001 From: Pau Baiget Date: Tue, 29 Jan 2019 15:00:33 +0000 Subject: [PATCH 1/3] gapit: Add OutputCSV flag to benchmark (#2540). This flag produces a single row of comma-separated data. Also, all time information is expressed in milliseconds. --- cmd/gapit/benchmark.go | 72 ++++++++++++++++++++++++++++-------------- cmd/gapit/flags.go | 1 + 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/cmd/gapit/benchmark.go b/cmd/gapit/benchmark.go index 2165efeb51..6a1a0cf86f 100644 --- a/cmd/gapit/benchmark.go +++ b/cmd/gapit/benchmark.go @@ -17,6 +17,7 @@ package main import ( "bytes" "context" + "encoding/csv" "encoding/json" "flag" "fmt" @@ -585,34 +586,57 @@ func (verb *benchmarkVerb) Run(ctx context.Context, flags flag.FlagSet) error { ctx = oldCtx writeOutput := func() { - w := tabwriter.NewWriter(os.Stdout, 4, 4, 3, ' ', 0) - fmt.Fprintln(w, "Trace Time\tTrace Size\tTrace Frames\tState Serialization\tTrace Frame Time\tInteractive") - fmt.Fprintln(w, "----------\t----------\t------------\t-------------------\t----------------\t-----------") - fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%v\t%v\n", - verb.traceDoneTime.Sub(verb.beforeStartTraceTime), - verb.traceSizeInBytes, - verb.traceFrames, - time.Duration(stateTime)*time.Nanosecond, - time.Duration(frameTime)*time.Nanosecond, - verb.gapisInteractiveTime.Sub(verb.traceDoneTime), - ) - w.Flush() preMecFramerate := float64(stateBuildStartTime - traceStartTimestamp) if verb.StartFrame > 0 { preMecFramerate = preMecFramerate / float64(verb.StartFrame) } - fmt.Fprintln(os.Stdout, "") - w = tabwriter.NewWriter(os.Stdout, 4, 4, 3, ' ', 0) - fmt.Fprintln(w, "Caching Done\tInteraction\tMax Memory\tBefore MEC Frame Time\tTrailing Frame Time") - fmt.Fprintln(w, "------------\t-----------\t----------\t---------------------\t-----------------") - fmt.Fprintf(w, "%+v\t%+v\t%+v\t%+v\t%+v\n", - verb.gapisCachingDoneTime.Sub(verb.traceDoneTime), - verb.interactionDoneTime.Sub(verb.interactionStartTime), - traceMaxMemory, - time.Duration(preMecFramerate)*time.Nanosecond, - time.Duration(nonLoadingFrameTime)*time.Nanosecond, - ) - w.Flush() + if verb.OutputCSV { + csvWriter := csv.NewWriter(os.Stdout) + defer csvWriter.Flush() + header := []string{ + "Trace Time (ms)","Trace Size","Trace Frames","State Serialization (ms)","Trace Frame Time (ms)","Interactive (ms)", + "Caching Done (ms)","Interaction (ms)","Max Memory","Before MEC Frame Time (ms)","Trailing Frame Time (ms)"} + csvWriter.Write(header) + record := []string{ + fmt.Sprint(float64(verb.traceDoneTime.Sub(verb.beforeStartTraceTime).Nanoseconds()) / float64(time.Millisecond)), + fmt.Sprint(verb.traceSizeInBytes), + fmt.Sprint(verb.traceFrames), + fmt.Sprint(stateTime / float64(time.Millisecond)), + fmt.Sprint(frameTime / float64(time.Millisecond)), + fmt.Sprint(float64(verb.gapisInteractiveTime.Sub(verb.traceDoneTime).Nanoseconds()) / float64(time.Millisecond)), + fmt.Sprint(float64(verb.gapisCachingDoneTime.Sub(verb.traceDoneTime).Nanoseconds()) / float64(time.Millisecond)), + fmt.Sprint(float64(verb.interactionDoneTime.Sub(verb.interactionStartTime).Nanoseconds()) / float64(time.Millisecond)), + fmt.Sprint(traceMaxMemory), + fmt.Sprint(preMecFramerate / float64(time.Millisecond)), + fmt.Sprint(float64(nonLoadingFrameTime) / float64(time.Millisecond)), + } + csvWriter.Write(record) + } else { + w := tabwriter.NewWriter(os.Stdout, 4, 4, 3, ' ', 0) + fmt.Fprintln(w, "Trace Time\tTrace Size\tTrace Frames\tState Serialization\tTrace Frame Time\tInteractive") + fmt.Fprintln(w, "----------\t----------\t------------\t-------------------\t----------------\t-----------") + fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%v\t%v\n", + verb.traceDoneTime.Sub(verb.beforeStartTraceTime), + verb.traceSizeInBytes, + verb.traceFrames, + time.Duration(stateTime)*time.Nanosecond, + time.Duration(frameTime)*time.Nanosecond, + verb.gapisInteractiveTime.Sub(verb.traceDoneTime), + ) + w.Flush() + fmt.Fprintln(os.Stdout, "") + w = tabwriter.NewWriter(os.Stdout, 4, 4, 3, ' ', 0) + fmt.Fprintln(w, "Caching Done\tInteraction\tMax Memory\tBefore MEC Frame Time\tTrailing Frame Time") + fmt.Fprintln(w, "------------\t-----------\t----------\t---------------------\t-----------------") + fmt.Fprintf(w, "%+v\t%+v\t%+v\t%+v\t%+v\n", + verb.gapisCachingDoneTime.Sub(verb.traceDoneTime), + verb.interactionDoneTime.Sub(verb.interactionStartTime), + traceMaxMemory, + time.Duration(preMecFramerate)*time.Nanosecond, + time.Duration(nonLoadingFrameTime)*time.Nanosecond, + ) + w.Flush() + } } writeTrace = func(path string, gapisTrace, gapitTrace *bytes.Buffer) error { diff --git a/cmd/gapit/flags.go b/cmd/gapit/flags.go index 637be943e8..9ab1a96977 100644 --- a/cmd/gapit/flags.go +++ b/cmd/gapit/flags.go @@ -266,6 +266,7 @@ type ( DumpTrace string `help:"dump a systrace of gapis"` StartFrame int `help:"perform a MEC trace starting at this frame"` NoOpt bool `help:"disables optimization of the replay stream"` + OutputCSV bool `help:"outputs data in CSV-friendly format"` } StatusFlags struct { From b203af51daa12ba33a634eec0c69f1cd08599885 Mon Sep 17 00:00:00 2001 From: Pau Baiget Date: Thu, 31 Jan 2019 12:27:48 +0000 Subject: [PATCH 2/3] Remove defer and place flush at the proper place --- cmd/gapit/benchmark.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gapit/benchmark.go b/cmd/gapit/benchmark.go index 6a1a0cf86f..c73df800c4 100644 --- a/cmd/gapit/benchmark.go +++ b/cmd/gapit/benchmark.go @@ -592,7 +592,6 @@ func (verb *benchmarkVerb) Run(ctx context.Context, flags flag.FlagSet) error { } if verb.OutputCSV { csvWriter := csv.NewWriter(os.Stdout) - defer csvWriter.Flush() header := []string{ "Trace Time (ms)","Trace Size","Trace Frames","State Serialization (ms)","Trace Frame Time (ms)","Interactive (ms)", "Caching Done (ms)","Interaction (ms)","Max Memory","Before MEC Frame Time (ms)","Trailing Frame Time (ms)"} @@ -611,6 +610,7 @@ func (verb *benchmarkVerb) Run(ctx context.Context, flags flag.FlagSet) error { fmt.Sprint(float64(nonLoadingFrameTime) / float64(time.Millisecond)), } csvWriter.Write(record) + csvWriter.Flush() } else { w := tabwriter.NewWriter(os.Stdout, 4, 4, 3, ' ', 0) fmt.Fprintln(w, "Trace Time\tTrace Size\tTrace Frames\tState Serialization\tTrace Frame Time\tInteractive") From d2007e04815642588ec2749fdc13658bb594addb Mon Sep 17 00:00:00 2001 From: Pau Baiget Date: Thu, 31 Jan 2019 15:25:45 +0000 Subject: [PATCH 3/3] Fix code style --- cmd/gapit/benchmark.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/gapit/benchmark.go b/cmd/gapit/benchmark.go index c73df800c4..17f11fd92c 100644 --- a/cmd/gapit/benchmark.go +++ b/cmd/gapit/benchmark.go @@ -512,9 +512,9 @@ func (verb *benchmarkVerb) Run(ctx context.Context, flags flag.FlagSet) error { for _, types := range resources.GetTypes() { for ii, v := range types.GetResources() { if (types.Type == api.ResourceType_TextureResource || - types.Type == api.ResourceType_ShaderResource || - types.Type == api.ResourceType_ProgramResource) && - ii < 30 { + types.Type == api.ResourceType_ShaderResource || + types.Type == api.ResourceType_ProgramResource) && + ii < 30 { gotResources.Add(1) go func(id *path.ID) { defer gotResources.Done() @@ -593,8 +593,8 @@ func (verb *benchmarkVerb) Run(ctx context.Context, flags flag.FlagSet) error { if verb.OutputCSV { csvWriter := csv.NewWriter(os.Stdout) header := []string{ - "Trace Time (ms)","Trace Size","Trace Frames","State Serialization (ms)","Trace Frame Time (ms)","Interactive (ms)", - "Caching Done (ms)","Interaction (ms)","Max Memory","Before MEC Frame Time (ms)","Trailing Frame Time (ms)"} + "Trace Time (ms)", "Trace Size", "Trace Frames", "State Serialization (ms)", "Trace Frame Time (ms)", "Interactive (ms)", + "Caching Done (ms)", "Interaction (ms)", "Max Memory", "Before MEC Frame Time (ms)", "Trailing Frame Time (ms)"} csvWriter.Write(header) record := []string{ fmt.Sprint(float64(verb.traceDoneTime.Sub(verb.beforeStartTraceTime).Nanoseconds()) / float64(time.Millisecond)), @@ -611,7 +611,7 @@ func (verb *benchmarkVerb) Run(ctx context.Context, flags flag.FlagSet) error { } csvWriter.Write(record) csvWriter.Flush() - } else { + } else { w := tabwriter.NewWriter(os.Stdout, 4, 4, 3, ' ', 0) fmt.Fprintln(w, "Trace Time\tTrace Size\tTrace Frames\tState Serialization\tTrace Frame Time\tInteractive") fmt.Fprintln(w, "----------\t----------\t------------\t-------------------\t----------------\t-----------")