Go 如何测量前后字节大小和压缩时间
我想要gzip一个字符串(它实际上是一个JSON响应)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
如何轻松输出压缩前后的字节大小,更重要的是如何将压缩和解压缩回字符串所需的时间?您可以根据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()
}
}