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

Go 如何测量前后字节大小和压缩时间,go,compression,Go,Compression,我想要gzip一个字符串(它实际上是一个JSON响应) 如何轻松输出压缩前后的字节大小,更重要的是如何将压缩和解压缩回字符串所需的时间?您可以根据Nipun Talukdar的评论计算大小 len([]字节(“YourDataHere”)) b、 Len() 并使用time.Now()和time.Since()获取所用时间 var b bytes.Buffer input := []byte("YourDataHere") fmt.Println("Input size : ", len(in

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


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

您可以根据Nipun Talukdar的评论计算大小

len([]字节(“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())
在函数的开头。

在Go here中有一些示例说明如何执行此操作

谢天谢地,它是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()
  }
}
//版权所有2011 Go作者。版权所有。
//此源代码的使用受BSD样式的约束
//可以在许可证文件中找到的许可证。
//此基准测试gzip和gunzip性能。
包go1
进口(
“字节”
gz“压缩/gzip”
“io”
“io/ioutil”
“测试”
)
变量(
jsongunz=bytes.Repeat(jsonbytes,10)
jsongz[]字节
)
func init(){
var buf字节。缓冲区
c:=gz.NewWriter(&buf)
c、 书写(jsongunz)
c、 关闭()
jsongz=buf.Bytes()
}
func gzip(){
c:=gz.NewWriter(ioutil.Discard)
如果3;,err:=c.Write(jsongunz);err!=nil{
恐慌(错误)
}
如果错误:=c.Close();错误!=nil{
恐慌(错误)
}
}
func gunzip(){
r、 err:=gz.NewReader(bytes.NewBuffer(jsongz))
如果错误!=零{
恐慌(错误)
}
如果3;,err:=io.Copy(ioutil.Discard,r);err!=nil{
恐慌(错误)
}
r、 关闭()
}
func BenchmarkGzip(b*testing.b){
b、 SetBytes(int64(len(jsongunz)))
对于i:=0;i
b.Len()将返回压缩后的字节数。len([]字节(“YourDataHere”))返回输入数据(未压缩)长度。另外,“n,err:=gz.Write([]字节(“YourDataHere”))将n设置为发送到gzip writer的字节数(即输入大小)。在获取所用时间和输出大小之前,我们应该执行gz.Flush()。
// 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()
  }
}