[インデックス 13047] ファイルの概要
このコミットは、Go言語の標準ライブラリ compress
パッケージ内のテストデータとベンチマークに関する変更です。具体的には、圧縮アルゴリズムのベンチマークの現実性を高めるため、テストに使用されるデータファイルのサイズを拡張し、それに伴うテストコードの調整が行われています。
コミット
commit 738e77aa4fb4daeef3ba8e3db854581e4a10229a
Author: Nigel Tao <nigeltao@golang.org>
Date: Wed May 9 10:02:28 2012 +1000
compress/testdata: change {e,pi}.txt from 10k to 100k digits.
These files change from exactly 10003 bytes long to 100003: a digit,
a '.', 100k digits, and a '\n'.
The magic constants in compress/flate/deflate_test.go change since
deflateInflateStringTests checks that the compressed form of e.txt
is not 'too large'. I'm not exactly sure how these numbers were
originally calculated (they were introduced in codereview 5554066
"make lazy matching work"); perhaps krasin@golang.org can comment.
My change was to increase the first one (no compression) to a tight
bound, and multiply all the others by 10.
Benchcmp numbers for compress/flate and compress/lzw below. LZW's
window size of 4096 is less than 10k, so shows no significant change.
Flate's window size is 32768, between 10k and 100k, and so the .*1e5
and .*1e6 benchmarks show a dramatic drop, since the compressed forms
are no longer a trivial forward copy of 10k digits repeated over and
over, but should now be more representative of real world usage.
compress/flate:
benchmark old MB/s new MB/s speedup
BenchmarkDecodeDigitsSpeed1e4 16.58 16.52 1.00x
BenchmarkDecodeDigitsSpeed1e5 68.09 18.10 0.27x
BenchmarkDecodeDigitsSpeed1e6 124.63 18.35 0.15x
BenchmarkDecodeDigitsDefault1e4 17.21 17.12 0.99x
BenchmarkDecodeDigitsDefault1e5 118.28 19.19 0.16x
BenchmarkDecodeDigitsDefault1e6 295.62 20.52 0.07x
BenchmarkDecodeDigitsCompress1e4 17.22 17.17 1.00x
BenchmarkDecodeDigitsCompress1e5 118.19 19.21 0.16x
BenchmarkDecodeDigitsCompress1e6 295.59 20.55 0.07x
BenchmarkEncodeDigitsSpeed1e4 8.18 8.19 1.00x
BenchmarkEncodeDigitsSpeed1e5 43.22 12.84 0.30x
BenchmarkEncodeDigitsSpeed1e6 80.76 13.48 0.17x
BenchmarkEncodeDigitsDefault1e4 6.29 6.19 0.98x
BenchmarkEncodeDigitsDefault1e5 31.63 3.60 0.11x
BenchmarkEncodeDigitsDefault1e6 52.97 3.24 0.06x
BenchmarkEncodeDigitsCompress1e4 6.20 6.19 1.00x
BenchmarkEncodeDigitsCompress1e5 31.59 3.59 0.11x
BenchmarkEncodeDigitsCompress1e6 53.18 3.25 0.06x
compress/lzw:
benchmark old MB/s new MB/s speedup
BenchmarkDecoder1e4 21.99 22.09 1.00x
BenchmarkDecoder1e5 22.77 22.71 1.00x
BenchmarkDecoder1e6 22.90 22.90 1.00x
BenchmarkEncoder1e4 21.04 21.19 1.01x
BenchmarkEncoder1e5 22.06 22.06 1.00x
BenchmarkEncoder1e6 22.16 22.28 1.01x
R=rsc
CC=golang-dev, krasin
https://golang.org/cl/6207043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/738e77aa4fb4daeef3ba8e3db854581e4a10229a
元コミット内容
compress/testdata
ディレクトリ内の e.txt
と pi.txt
というテストデータファイルを、これまでの約10KBから約100KBに拡張しました。これにより、これらのファイルは「1桁、小数点、10万桁の数字、改行」という構成で、正確に100003バイト長になります。
この変更に伴い、compress/flate/deflate_test.go
内の「マジック定数」が変更されました。これは deflateInflateStringTests
が e.txt
の圧縮形式が「大きすぎないか」をチェックするためです。元の定数の計算方法が不明確であったため、最初の(非圧縮の)定数を厳密な上限に増やし、他の定数を10倍にしました。
ベンチマーク結果を見ると、LZWのウィンドウサイズ(4096バイト)が10KB未満であるため、LZWのベンチマークには大きな変化がありませんでした。一方、Flateのウィンドウサイズ(32768バイト)は10KBと100KBの間にあるため、.*1e5
および .*1e6
のベンチマークでは劇的な性能低下が見られました。これは、圧縮形式がもはや10KBの数字の単純な繰り返しコピーではなくなり、より現実世界の使用状況を反映するようになったためです。
変更の背景
このコミットの主な背景は、Go言語の compress
パッケージにおける圧縮アルゴリズムのベンチマークの精度と現実性を向上させることです。
以前のテストデータ (e.txt
と pi.txt
) は約10KBのサイズでした。これは、特に flate
(DEFLATE) のような辞書ベースの圧縮アルゴリズムの「ウィンドウサイズ」よりも小さい場合、ベンチマーク結果が実際の性能を正確に反映しないという問題がありました。
具体的には、flate
のウィンドウサイズは32KB (32768バイト) です。テストデータが10KBの場合、ベンチマークで100KBや1MBのデータを処理しようとすると、元の10KBのデータが単純に繰り返されることになります。このような繰り返しデータは、圧縮アルゴリズムが非常に効率的に「前方参照コピー」(以前に出現したデータの繰り返し)として圧縮できるため、非常に高い圧縮率と処理速度を示します。しかし、これは現実世界のデータ(通常は繰り返しが少ない)の圧縮性能とはかけ離れた結果となります。
この問題を解決するため、テストデータのサイズを flate
のウィンドウサイズを超える100KBに拡張することで、アルゴリズムがより多様なデータパターンに直面し、その結果、ベンチマークがより現実的な性能指標を提供するようになりました。これにより、圧縮アルゴリズムの最適化や改善が、実際のアプリケーションでの性能向上に直結するようになります。
前提知識の解説
1. 圧縮アルゴリズム (Flate/DEFLATE と LZW)
-
Flate (DEFLATE):
- DEFLATEは、LZ77アルゴリズムとハフマン符号化を組み合わせた可逆データ圧縮アルゴリズムです。ZIP、gzip、PNGなどのファイル形式で広く使用されています。
- LZ77: データの繰り返しパターン(一致する文字列)を見つけて、その位置(距離)と長さで置き換えることで圧縮します。この「一致」を探す範囲が「ウィンドウサイズ」と呼ばれます。
- ハフマン符号化: 繰り返しパターンを置き換えた後のデータや、繰り返しではないデータに対して、出現頻度の高いシンボルには短いビット列を、低いシンボルには長いビット列を割り当てることでさらに圧縮します。
- DEFLATEの一般的なウィンドウサイズは32KB (32768バイト) です。これは、過去32KBのデータの中から繰り返しパターンを探すことを意味します。
-
LZW (Lempel-Ziv-Welch):
- LZWは、LZ78アルゴリズムを基にした可逆データ圧縮アルゴリズムです。GIF画像形式やTIFF、PDFなどで使用されていました。
- LZWは、入力データから出現する文字列のパターンを辞書に登録し、その辞書のエントリのインデックスで文字列を置き換えることで圧縮します。
- LZWのウィンドウサイズは、通常、DEFLATEよりも小さい傾向にあります。このコミットでは4096バイトと記載されています。
2. 圧縮アルゴリズムにおける「ウィンドウサイズ」
圧縮アルゴリズム、特にLZ77ベースのアルゴリズム(DEFLATEなど)において、「ウィンドウサイズ」は非常に重要な概念です。 これは、圧縮器が過去のデータの中から繰り返しパターン(一致する文字列)を探すことができる範囲の最大値を示します。
- 大きなウィンドウサイズ: より広範囲の過去のデータを参照できるため、より長い、またはより多くの繰り返しパターンを見つけやすくなり、圧縮率が向上する可能性があります。しかし、その分、メモリ使用量が増え、一致を探すための計算コストも高くなります。
- 小さなウィンドウサイズ: 参照できる過去のデータが限られるため、圧縮率は低下する可能性がありますが、メモリ使用量が少なく、処理速度が速くなる傾向があります。
このコミットの文脈では、flate
のウィンドウサイズが32KBであるのに対し、lzw
のウィンドウサイズが4KBであることが、ベンチマーク結果の違いに大きく影響しています。
3. ベンチマークの重要性
ソフトウェア開発において、ベンチマークはコードの性能を測定し、最適化の方向性を決定するために不可欠です。特に圧縮アルゴリズムのような性能が重視される分野では、ベンチマークは以下の点で重要です。
- 性能評価: 特定のアルゴリズムや実装がどれくらいの速度でデータを処理できるかを定量的に評価します。
- ボトルネック特定: 性能の低い部分(ボトルネック)を特定し、改善の焦点を絞るのに役立ちます。
- 回帰テスト: コード変更が性能に悪影響を与えていないかを確認します。
- 現実性の確保: ベンチマークに使用するデータが現実世界のユースケースを反映していることが極めて重要です。非現実的なデータ(例えば、非常に単純な繰り返しパターン)を使用すると、誤解を招くような高い性能値が得られ、実際のアプリケーションでの性能とはかけ離れた結果になる可能性があります。このコミットはまさにこの「現実性の確保」を目的としています。
4. Go言語の compress
パッケージ
Go言語の標準ライブラリには、compress
パッケージが含まれており、様々な圧縮アルゴリズムの実装を提供しています。これには compress/flate
(DEFLATE)、compress/gzip
、compress/lzw
などが含まれます。これらのパッケージは、Goアプリケーションでデータの圧縮・解凍を簡単に行うためのAPIを提供します。
技術的詳細
このコミットの技術的な核心は、圧縮アルゴリズムのベンチマークの「現実性」を向上させるためのテストデータとテストロジックの調整にあります。
1. テストデータ (e.txt
, pi.txt
) の拡張
- 変更点:
src/pkg/compress/testdata/e.txt
とsrc/pkg/compress/testdata/pi.txt
の内容が、それぞれ約10KBの数字列から約100KBの数字列に拡張されました。 - 目的: 以前の10KBのデータは、
flate
(DEFLATE) アルゴリズムのウィンドウサイズ(32768バイト、約32KB)よりも小さかったため、ベンチマークで100KBや1MBといった大きなデータを扱う際に、元の10KBのデータが単純に繰り返される状況が発生していました。このような繰り返しデータは、DEFLATEのLZ77部分が「前方参照コピー」として非常に効率的に圧縮できるため、非現実的に高い圧縮率と処理速度を示していました。 - 効果: データを100KBに拡張することで、データサイズが
flate
のウィンドウサイズを超えました。これにより、ベンチマークはもはや単純な繰り返しデータの圧縮ではなく、より多様なデータパターンに対するアルゴリズムの性能を測定するようになり、現実世界での性能をより正確に反映するようになりました。
2. flate
ベンチマークへの影響
コミットメッセージに示されているベンチマーク結果は、この変更の意図を明確に示しています。
BenchmarkDecodeDigitsSpeed1e5
(100KBデータ):- 旧: 68.09 MB/s
- 新: 18.10 MB/s
- 速度比: 0.27x (約73%低下)
BenchmarkDecodeDigitsSpeed1e6
(1MBデータ):- 旧: 124.63 MB/s
- 新: 18.35 MB/s
- 速度比: 0.15x (約85%低下)
これらの劇的な速度低下は、以前のベンチマークが「単純な繰り返しデータの高速コピー」を測定していたのに対し、変更後は「より複雑で現実的なデータの圧縮・解凍」を測定するようになったことを示しています。これは、アルゴリズム自体の性能が低下したわけではなく、ベンチマークがより厳しく、より現実的なシナリオを反映するようになった結果です。
3. lzw
ベンチマークへの影響
- LZWのウィンドウサイズ: コミットメッセージによると、LZWのウィンドウサイズは4096バイト(約4KB)です。
- 結果:
lzw
のベンチマーク(例:BenchmarkDecoder1e5
,BenchmarkEncoder1e5
)では、旧バージョンと新バージョンでほとんど速度の変化が見られません(速度比が約1.00x)。 - 理由: LZWのウィンドウサイズが元々10KBのテストデータよりも小さいため、テストデータが100KBに拡張されても、LZWアルゴリズムが参照できる範囲は変わらず、ベンチマークの挙動に大きな影響を与えなかったためです。これは、LZWがDEFLATEとは異なる圧縮戦略(辞書ベース)を採用していることと、そのウィンドウサイズの特性によるものです。
4. マジック定数の調整 (deflate_test.go
)
- 変更点:
src/pkg/compress/flate/deflate_test.go
内のdeflateInflateStringTests
配列にあるe.txt
に関連する整数値の配列が変更されました。具体的には、{10013, 5065, ...}
から{100018, 50650, ...}
のように、値が約10倍に増加しています。 - 目的: これらの「マジック定数」は、
e.txt
を圧縮した際の期待される出力サイズ(またはその上限)を表していると考えられます。テストデータが10倍に増えたため、圧縮後のサイズもそれに比例して大きくなることが予想されます。したがって、テストが失敗しないように、これらの期待値も調整する必要がありました。 - 詳細: コミットメッセージでは、これらの定数が「
e.txt
の圧縮形式が『大きすぎないか』をチェックする」と説明されています。これは、圧縮アルゴリズムが期待通りに動作し、異常に大きな出力(例えば、圧縮に失敗して元のデータよりも大きくなる場合など)を生成しないことを保証するためのアサーションです。テストデータが10倍になったため、非圧縮時のサイズ(10003バイトから100003バイト)も約10倍になり、それに伴い圧縮後のサイズも増加するため、これらの定数を調整する必要がありました。
5. reader_test.go
からのコメント削除
src/pkg/compress/flate/reader_test.go
から、e.txt
が10KBしかないため、100KBや1MBのベンチマークではデータが繰り返され、flate
が前方コピーとして効率的に圧縮してしまうという問題に関するTODOコメントが削除されました。これは、今回のコミットでその問題が解決されたためです。
コアとなるコードの変更箇所
このコミットでは、主に以下のファイルが変更されています。
src/pkg/compress/flate/deflate_test.go
src/pkg/compress/flate/reader_test.go
src/pkg/compress/lzw/reader_test.go
src/pkg/compress/lzw/writer_test.go
src/pkg/compress/testdata/e.txt
src/pkg/compress/testdata/pi.txt
特にコアとなる変更は、テストデータファイル (e.txt
, pi.txt
) の内容変更と、それに伴う deflate_test.go
のマジック定数の更新です。
src/pkg/compress/flate/deflate_test.go
--- a/src/pkg/compress/flate/deflate_test.go
+++ b/src/pkg/compress/flate/deflate_test.go
@@ -290,7 +290,7 @@ var deflateInflateStringTests = []deflateInflateStringTest{
{
"../testdata/e.txt",
"2.718281828...",
- [...]int{10013, 5065, 5096, 5115, 5093, 5079, 5079, 5079, 5079, 5079},
+ [...]int{100018, 50650, 50960, 51150, 50930, 50790, 50790, 50790, 50790, 50790},
},
{
"../testdata/Mark.Twain-Tom.Sawyer.txt",
src/pkg/compress/testdata/e.txt
および src/pkg/compress/testdata/pi.txt
これらのファイルは、実際のコミットでは内容全体が10KBから100KBに拡張されています。差分表示では、元の1行のデータが新しい1行のデータに置き換えられているように見えますが、実際にはその内容が大幅に長くなっています。
--- a/src/pkg/compress/testdata/e.txt
+++ b/src/pkg/compress/testdata/e.txt
@@ -1 +1 @@
-2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770417189861068739696552126715468895703503540212340784981933432106817012100562788023519303322474501585390473041995777709350366041699732972508868769664035557071622684471625607988265178713419512466520103059212366771943252786753985589448969709640975459185695638023637016211204774272283648961342251644507818244235294863637214174023889344124796357437026375529444833799801612549227850925778256209262264832627793338656648162772516401910590049164499828931505660472580277863186415519565324425869829469593080191529872117255634754639644791014590409058629849679128740687050489585867174798546677575732056812884592054133405392200011378630094556068816674001698420558040336379537645203040243225661352783695117788386387443966253224985065499588623428189970773327617178392803494650143455889707194258639877275471096295374152111513683506275260232648472870392076431005958411661205452970302364725492966693811513732275364509888903136020572481765851180630364428123149655070475102544650117272115551948668508003685322818315219600373562527944951582841882947876108526398... [truncated]
+2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770417189861068739696552126715468895703503540212340784981933432106817012100562788023519303322474501585390473041995777709350366041699732972508868769664035557071622684471625607988265178713419512466520103059212366771943252786753985589448969709640975459185695638023637016211204774272283648961342251644507818244235294863637214174023889344124796357437026375529444833799801612549227850925778256209262264832627793338656648162772516401910590049164499828931505660472580277863186415519565324425869829469593080191529872117255634754639644791014590409058629849679128740687050489585867174798546677575732056812884592054133405392200011378630094556068816674001698420558040336379537645203040243225661352783695117788386387443966253224985065499588623428189970773327617178392803494650143455889707194258639877275471096295374152111513683506275260232648472870392076431005958411661205452970302364725492966693811513732275364509888903136020572481765851180630364428123149655070475102544650117272115551948668508003685322818315219600373562527944951582841882947876108526398... [truncated]
src/pkg/compress/flate/reader_test.go
TODOコメントの削除。
--- a/src/pkg/compress/flate/reader_test.go
+++ b/src/pkg/compress/flate/reader_test.go
@@ -21,14 +21,6 @@ var testfiles = []string{
// Digits is the digits of the irrational number e. Its decimal representation
// does not repeat, but there are only 10 posible digits, so it should be
// reasonably compressible.
- //
- // TODO(nigeltao): e.txt is only 10K long, so when benchmarking 100K or 1000K
- // of input, the digits are just repeated from the beginning, and flate can
- // trivially compress this as a length/distance copy operation. Thus,
- // BenchmarkDecodeDigitsXxx1e6 is essentially just measuring the speed of the
- // forwardCopy implementation, but isn't particularly representative of real
- // usage. The TODO is to replace e.txt with 100K digits, not just 10K digits,
- // since that's larger than the windowSize 1<<15 (= 32768).
digits: "../testdata/e.txt",
// Twain is Project Gutenberg's edition of Mark Twain's classic English novel.
twain: "../testdata/Mark.Twain-Tom.Sawyer.txt",
src/pkg/compress/lzw/reader_test.go
および src/pkg/compress/lzw/writer_test.go
これらのファイルでは、テストデータの読み込みと処理に関するロジックが修正されています。特に、ioutil.ReadFile
でファイルを読み込んだ後、buf0 = buf0[:10000]
のようにデータを10000バイトに切り詰めていた部分が削除され、代わりに読み込んだデータが空でないかどうかのチェックと、ベンチマークの n
(処理バイト数) に合わせて buf0
を適切にスライスするロジックが追加されています。これにより、ベンチマークが指定されたバイト数 n
に対して、ファイル全体(100KB)を適切に利用できるようになります。
--- a/src/pkg/compress/lzw/reader_test.go
+++ b/src/pkg/compress/lzw/reader_test.go
@@ -114,11 +114,19 @@ func TestReader(t *testing.T) {
func benchmarkDecoder(b *testing.B, n int) {
b.StopTimer()
b.SetBytes(int64(n))
- buf0, _ := ioutil.ReadFile("../testdata/e.txt")
- buf0 = buf0[:10000]
+ buf0, err := ioutil.ReadFile("../testdata/e.txt")
+ if err != nil {
+ b.Fatal(err)
+ }
+ if len(buf0) == 0 {
+ b.Fatalf("test file has no data")
+ }
compressed := new(bytes.Buffer)
w := NewWriter(compressed, LSB, 8)
for i := 0; i < n; i += len(buf0) {
+ if len(buf0) > n-i {
+ buf0 = buf0[:n-i]
+ }
io.Copy(w, bytes.NewBuffer(buf0))
}
w.Close()
コアとなるコードの解説
1. src/pkg/compress/flate/deflate_test.go
の変更
このファイルの変更は、e.txt
のデータサイズが10倍になったことに直接対応しています。deflateInflateStringTests
は、特定の文字列(この場合は e.txt
の内容)を圧縮・解凍し、その結果が期待通りであるか、特に圧縮後のサイズが特定の閾値を超えていないかを検証するためのテストデータです。
元の e.txt
が約10KBだったとき、圧縮後のサイズに関する期待値は [...]int{10013, 5065, ...}
のように設定されていました。ここで 10013
は非圧縮時のサイズに近い値、他の値は異なる圧縮レベルや設定での圧縮後のサイズを示していると考えられます。
e.txt
が約100KBに拡張されたことで、非圧縮時のサイズは 100003
バイトになりました。それに伴い、圧縮後のサイズも比例して大きくなるため、テストが失敗しないようにこれらの期待値を約10倍に調整する必要がありました。例えば、10013
は 100018
に、5065
は 50650
に変更されています。これにより、テストは新しい大きなデータセットに対しても適切に機能し、圧縮アルゴリズムが期待される範囲内で動作していることを確認できます。
2. src/pkg/compress/testdata/e.txt
および src/pkg/compress/testdata/pi.txt
の変更
これらのファイルの内容が、実際の数学定数eとπの小数点以下桁数を約10万桁まで含むように更新されました。この変更は、前述の「変更の背景」と「技術的詳細」で述べたように、ベンチマークの現実性を高めるための最も根本的な変更です。
- 現実的なデータ: 単純な繰り返しパターンではなく、より複雑で非周期的な数字列を提供することで、圧縮アルゴリズムが実際のデータに遭遇した際の性能をより正確にシミュレートできます。
- ウィンドウサイズの影響:
flate
のウィンドウサイズ(32KB)を超えるデータを提供することで、アルゴリズムが前方参照コピーに過度に依存することなく、より広範囲のデータパターンを処理する能力が試されます。これにより、以前は隠れていた性能特性が明らかになり、より正確なベンチマーク結果が得られます。
3. src/pkg/compress/lzw/reader_test.go
および src/pkg/compress/lzw/writer_test.go
の変更
これらのファイルでは、ベンチマーク関数 (benchmarkDecoder
, benchmarkEncoder
) 内でテストデータを読み込むロジックが改善されています。
元のコードでは、ioutil.ReadFile("../testdata/e.txt")
でファイルを読み込んだ後、buf0 = buf0[:10000]
のように、読み込んだデータを強制的に10000バイトに切り詰めていました。これは、e.txt
が10KBだった時代には問題ありませんでしたが、ファイルが100KBに拡張された後もこの切り詰めが残っていると、ベンチマークが常に最初の10KBのデータしか利用しないことになり、データ拡張の意図が活かされません。
新しいコードでは、この切り詰めが削除され、以下の変更が加えられました。
- エラーハンドリングの追加:
ioutil.ReadFile
のエラーを適切に処理するようになりました。 - 空ファイルチェック: 読み込んだデータが空でないかを確認するようになりました。
- 動的なデータスライス:
for i := 0; i < n; i += len(buf0)
ループ内で、if len(buf0) > n-i { buf0 = buf0[:n-i] }
という行が追加されました。これは、ベンチマークが処理すべきバイト数n
に応じて、buf0
(読み込んだテストデータ)を適切にスライスし、必要な量だけを処理に回すためのものです。これにより、ベンチマークは指定された総バイト数n
に対して、拡張された100KBのe.txt
の内容を効率的に利用できるようになります。
これらの変更により、LZWのベンチマークも、拡張されたテストデータを適切に利用できるようになり、より正確な性能測定が可能になりました。ただし、LZWのウィンドウサイズが小さいため、flate
のような劇的な性能変化は見られませんでした。
関連リンク
- Go言語の
compress
パッケージドキュメント: https://pkg.go.dev/compress - Go言語の
compress/flate
パッケージドキュメント: https://pkg.go.dev/compress/flate - Go言語の
compress/lzw
パッケージドキュメント: https://pkg.go.dev/compress/lzw - Go CL 6207043 (このコミットのChange-Id): https://golang.org/cl/6207043
参考にした情報源リンク
- DEFLATE (Wikipedia): https://ja.wikipedia.org/wiki/DEFLATE
- LZW (Wikipedia): https://ja.wikipedia.org/wiki/LZW
- LZ77 and LZ78 (Wikipedia): https://en.wikipedia.org/wiki/LZ77_and_LZ78
- ハフマン符号 (Wikipedia): https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%95%E3%83%9E%E3%83%B3%E7%AC%A6%E5%8F%B7
- Go言語のベンチマークに関する公式ドキュメント (Go Testing): https://pkg.go.dev/testing (特に
Benchmark
関数に関するセクション) - Go言語の
ioutil
パッケージ (Go 1.16で非推奨、os
とio
に移行): https://pkg.go.dev/io/ioutil (コミット当時の状況を反映)