我想gzip一个字符串(它实际上是一个JSON响应)
var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write([]byte("YourDataHere")); err != nil {
panic(err)
}
如何在压缩前后轻松输出字节大小,更重要的是如何将压缩和解压缩到字符串所需的时间?
答案 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