如何在字节大小和压缩时间之前和之后测量

时间:2016-04-19 03:00:10

标签: go compression

我想gzip一个字符串(它实际上是一个JSON响应)

var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write([]byte("YourDataHere")); err != nil {
    panic(err)
}

如何在压缩前后轻松输出字节大小,更重要的是如何将压缩和解压缩到字符串所需的时间?

3 个答案:

答案 0 :(得分:1)

您可以根据Nipun Talukdar的评论来计算尺寸。

len([]byte("YourDataHere")) b.Len()

并使用time.Now()time.Since()来获取时间。

var b bytes.Buffer
input := []byte("YourDataHere")

fmt.Println("Input size : ", len(input))

gz := gzip.NewWriter(&b)


start := time.Now() 

gz.Write(input)
if _, err := gz.Flush(); err != nil {
        panic(err)
}


totalTime := time.Since(start) 

fmt.Println("Compressed size : ", b.Len(), "\nTime taken : ", totalTime)
gz.Close()

使用解压缩可以应用相同的方法。 您还可以创建一个可以执行计时的支持功能。

func timer(startTime time.Time) {

totalTime := time.Since(startTime)
log.Println("Time taken : ",totalTime)

}

用法:defer timer(time.Now())在函数的开头。

答案 1 :(得分:0)

在Go here

中有一些如何做到这一点的例子

https://golang.org/test/bench/go1/gzip_test.go

值得庆幸的是BSD获得许可...

// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This benchmark tests gzip and gunzip performance.

package go1 

import (
  "bytes"
  gz "compress/gzip"
  "io"
  "io/ioutil"
  "testing"
)

var (
  jsongunz = bytes.Repeat(jsonbytes, 10) 
  jsongz   []byte
)

func init() {
  var buf bytes.Buffer
  c := gz.NewWriter(&buf)
  c.Write(jsongunz)
  c.Close()
  jsongz = buf.Bytes()
}

func gzip() {
  c := gz.NewWriter(ioutil.Discard)
  if _, err := c.Write(jsongunz); err != nil {
    panic(err)
  }
  if err := c.Close(); err != nil {
    panic(err)
  }
}

func gunzip() {
  r, err := gz.NewReader(bytes.NewBuffer(jsongz))
  if err != nil {
    panic(err)
  }
  if _, err := io.Copy(ioutil.Discard, r); err != nil {
    panic(err)
  }
  r.Close()
}

func BenchmarkGzip(b *testing.B) {
  b.SetBytes(int64(len(jsongunz)))
  for i := 0; i < b.N; i++ {
    gzip()
  }
}

func BenchmarkGunzip(b *testing.B) {
  b.SetBytes(int64(len(jsongunz)))
  for i := 0; i < b.N; i++ {
    gunzip()
  }
}

答案 2 :(得分:0)

遗憾的是,library(broom.mixed) 无法报告写入底层流的压缩字节数。当底层流不在内存中时,它会变得更加复杂。

为了解决这个问题,我写了一个“计数 library(tidyverse) library(lmerTest) library(broom.mixed) example <- tribble( ~PERSON_ID, ~RANGE, ~outcome1, ~outcome2, ~outcome3, ~type, "1", "PRE", 1, 2, 3, "type1", "1", "POST", 2, 3, 4, "type1", "2", "PRE", 3, 4, 5, "type2", "2", "POST", 5, 6, 7, "type2", "3", "PRE", 6, 7, 8, "type3", "3", "POST", 9, 10, 11, "type3", "4", "PRE", 12, 12, 13, "type1", "4", "POST", 12, 13, 14, "type1", "5", "PRE", 13, 14, 15, "type2", "5", "POST", 15, 16, 17, "type2", "6", "PRE", 16, 17, 18, "type3", "6", "POST", 19, 10, 11, "type3" ) example |> nest(data = -type) |> mutate( m1 = map(data, ~ lmer(outcome1 ~ RANGE + (1|PERSON_ID), data = .x)), m2 = map(data, ~ lmer(outcome2 ~ RANGE + (1|PERSON_ID), data = .x)), m3 = map(data, ~ lmer(outcome3 ~ RANGE + (1|PERSON_ID), data = .x)), across(m1:m3, map, ~ .x |> tidy() |> select(estimate, p.value) |> slice(2)) ) |> select(-data) |> unnest(everything(), names_sep = "_") #> # A tibble: 3 × 7 #> type_type m1_estimate m1_p.value m2_estimate m2_p.value m3_estimate m3_p.value #> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> #> 1 type1 -0.5 0.500 -1 3.68e-10 -1 8.83e- 1 #> 2 type2 -2 0.888 -2 9.01e- 1 -2 2.70e-10 #> 3 type3 -3 0.887 2.00 7.28e- 1 2.00 7.28e- 1 ”,我把它放在 gzip.Writer 和底层流之间,这样我就可以计算和提取写入的压缩字节数。

Go Playground 中尝试以下代码。

io.Writer