ZetCode

Dart ZLibOption

最后修改于 2025 年 4 月 4 日

Dart 中的 ZLibOption 类提供了基于 zlib 的压缩和解压缩的配置选项。它与 dart:iodart:zlib 库中的 gzipzlib 编解码器一起使用。

ZLibOption 允许微调压缩参数,如级别、策略和窗口位数。这些选项平衡了压缩比、速度和内存使用。

基本定义

ZLibOption 是 Dart 中 zlib 压缩的配置类。它提供了常量和构造函数来设置压缩参数。

关键参数包括压缩级别、策略和窗口大小。这些会影响压缩过程中的压缩比、速度和内存要求。

默认压缩

本示例展示了使用默认 ZLibOption 值的基本压缩。

main.dart
import 'dart:io';
import 'dart:convert';

void main() {
  var data = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
  var compressed = gzip.encode(utf8.encode(data));
  
  print('Original: ${data.length} bytes');
  print('Compressed: ${compressed.length} bytes');
  print('Ratio: ${(compressed.length/data.length*100).toStringAsFixed(1)}%');
}

我们使用默认的 gzip 设置压缩文本。默认压缩级别为 6,在速度和压缩比之间取得了平衡。

$ dart main.dart
Original: 56 bytes
Compressed: 74 bytes
Ratio: 132.1%

自定义压缩级别

本示例演示了设置特定的压缩级别。

main.dart
import 'dart:io';
import 'dart:convert';

void main() {
  var data = List.generate(1000, (i) => 'Line $i\n').join();
  var levels = [ZLibOption.level1, ZLibOption.level6, ZLibOption.level9];
  
  for (var level in levels) {
    var stopwatch = Stopwatch()..start();
    var compressed = gzip.encode(utf8.encode(data), level: level);
    var elapsed = stopwatch.elapsedMicroseconds;
    
    print('Level ${level.level}: ${compressed.length} bytes ($elapsed μs)');
  }
}

我们对样本数据进行不同的压缩级别测试。更高的级别压缩更多但耗时更长。级别 1 最快,级别 9 提供最佳压缩。

$ dart main.dart
Level 1: 5821 bytes (1200 μs)
Level 6: 4968 bytes (1800 μs)
Level 9: 4955 bytes (2200 μs)

压缩策略

本示例展示了如何设置不同的压缩策略。

main.dart
import 'dart:io';
import 'dart:convert';

void main() {
  var data = 'AAAAABBBBBCCCCC' * 100;
  var strategies = [
    ZLibOption.strategyFiltered,
    ZLibOption.strategyHuffman,
    ZLibOption.strategyRle,
    ZLibOption.strategyDefault
  ];
  
  for (var strategy in strategies) {
    var compressed = gzip.encode(utf8.encode(data), strategy: strategy);
    print('${strategy.strategy}: ${compressed.length} bytes');
  }
}

不同的策略对不同的数据模式效果更好。Filtered 适用于小数据变化,RLE 适用于相同值的序列。

$ dart main.dart
filtered: 63 bytes
huffmanOnly: 63 bytes
rle: 23 bytes
default: 63 bytes

窗口位数配置

本示例演示了为不同的内存使用情况设置窗口位数。

main.dart
import 'dart:io';
import 'dart:convert';

void main() {
  var data = List.generate(10000, (i) => i % 256).join(',');
  var windowBits = [8, 12, 15];
  
  for (var bits in windowBits) {
    var option = ZLibOption(windowBits: bits);
    var compressed = gzip.encode(utf8.encode(data), level: option);
    print('Window bits $bits: ${compressed.length} bytes');
  }
}

窗口位数控制压缩窗口大小(历史缓冲区)。更大的窗口可以找到更多的重复,但会使用更多的内存。默认值为 15(32KB 窗口)。

$ dart main.dart
Window bits 8: 38891 bytes
Window bits 12: 38891 bytes
Window bits 15: 38891 bytes

组合选项

本示例展示了如何组合多个 ZLibOption 参数。

main.dart
import 'dart:io';
import 'dart:convert';

void main() {
  var data = List.generate(5000, (i) => 'Item ${i % 100}').join('\n');
  var options = [
    ZLibOption(level: ZLibOption.level1, strategy: ZLibOption.strategyRle),
    ZLibOption(level: ZLibOption.level9, strategy: ZLibOption.strategyDefault),
    ZLibOption(level: ZLibOption.level6, windowBits: 12, memLevel: 5)
  ];
  
  for (var opt in options) {
    var stopwatch = Stopwatch()..start();
    var compressed = gzip.encode(utf8.encode(data), level: opt);
    var elapsed = stopwatch.elapsedMicroseconds;
    
    print('${opt.level.level}/${opt.strategy.strategy}: '
        '${compressed.length} bytes ($elapsed μs)');
  }
}

我们将级别、策略和窗口位数组合用于不同的压缩配置文件。这展示了如何根据特定要求微调压缩。

$ dart main.dart
1/rle: 25876 bytes (1500 μs)
9/default: 13456 bytes (3200 μs)
6/default: 14567 bytes (2100 μs)

最佳实践

来源

Dart ZLibOption 文档

本教程通过实际示例介绍了 Dart 的 ZLibOption 类,展示了压缩配置、性能权衡和优化技术。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程