zLib 透明写入模式 "wT" 性能下降
zLib transparent write mode "wT" performance degradation
我希望 zLib 透明模式 ( gzptintf() ) 与常规 fprintf() 一样快。我发现 "wT" 的 zLib gzprintf() 比 fprintf() 慢 2.5 倍。这个性能问题有什么解决方法吗?
详情:
我在 Linux 上使用 libz.so.1.2.8(fedora 22,内核 4.0.5,Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz)为我的事件跟踪收集器提供输出文件压缩选项。为了保持旧版兼容性,我需要透明文件格式写入模式。
如我所见,gzopen 中的选项“T”允许写入无压缩且无 gzip header 记录的文件。
问题出在性能上。透明模式比简单的标准 fprintf 慢 ~2.5 倍。
这是快速测试结果(值在 TSC 中):
zLib]$ ./zlib_transparent
Performance fprintf vs gzprintf (transparent):
fprintf 22883026324
zLib transp 62305122876
ratio 2.72277
本次测试的来源:
#include <stdio.h>
#include <zlib.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#define NUMITERATIONS 10000000
static double buffer[NUMITERATIONS];
static __inline__ unsigned long long rdtsc(void){
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
long long test_fprintf(double *buffer){
long long t = rdtsc();
#ifdef USE_FPRINTF
double tmp = 0;
FILE *file = fopen("fprintf_file.txt", "w");
for (int i = 0; i < NUMITERATIONS; ++i) {
fprintf(file, "[%f:%f]\n", buffer[i], buffer[i] - tmp);
tmp = buffer[i] + i;
}
fclose(file);
#endif
return rdtsc() - t;
}
long long test_zlib_transparent(double *buffer){
long long t = rdtsc();
#ifdef USE_ZLIB
double tmp = 0;
gzFile file = gzopen("zlib_file.txt.gz", "wT");
for (int i = 0; i < NUMITERATIONS; ++i) {
gzprintf(file, "[%f:%f]\n", buffer[i], buffer[i] - tmp);
tmp = buffer[i] + i;
}
gzclose(file);
#endif
return rdtsc() - t;
}
int main(){
std::cout << "Performance fprintf vs gzprintf (transparent):" << std::endl;
long long dPrint = test_fprintf(buffer);
std::cout << " fprintf " << dPrint << std::endl;
long long dStream = test_zlib_transparent(buffer);
std::cout << "zLib transp " << dStream << std::endl;
std::cout << "ratio " << double(dStream)/double(dPrint) << std::endl;
return 0;
}
建造:
g++ -g -O3 -DUSE_ZLIB=1 -DUSE_FPRINTF=1 zlib_transparent.cpp -o zlib_transparent –lz
谢谢
谢尔盖
我的错。 (我写了gzprintf()
。)
write()
调用过于频繁。如果将 fprintf()
替换为 snprintf()
和 write()
.
,您将获得与 zlib 大致相同的性能
我会在下一个版本的 zlib 中改进这个。如果您想尝试,请申请 this diff。我不知道它将如何在 Linux 上执行,但是在 Mac OS X 上,透明模式下的 gzprintf()
现在快 10% 比 fprintf()
。 (没想到。)
我希望 zLib 透明模式 ( gzptintf() ) 与常规 fprintf() 一样快。我发现 "wT" 的 zLib gzprintf() 比 fprintf() 慢 2.5 倍。这个性能问题有什么解决方法吗?
详情:
我在 Linux 上使用 libz.so.1.2.8(fedora 22,内核 4.0.5,Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz)为我的事件跟踪收集器提供输出文件压缩选项。为了保持旧版兼容性,我需要透明文件格式写入模式。
如我所见,gzopen 中的选项“T”允许写入无压缩且无 gzip header 记录的文件。
问题出在性能上。透明模式比简单的标准 fprintf 慢 ~2.5 倍。
这是快速测试结果(值在 TSC 中):
zLib]$ ./zlib_transparent
Performance fprintf vs gzprintf (transparent):
fprintf 22883026324
zLib transp 62305122876
ratio 2.72277
本次测试的来源:
#include <stdio.h>
#include <zlib.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#define NUMITERATIONS 10000000
static double buffer[NUMITERATIONS];
static __inline__ unsigned long long rdtsc(void){
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
long long test_fprintf(double *buffer){
long long t = rdtsc();
#ifdef USE_FPRINTF
double tmp = 0;
FILE *file = fopen("fprintf_file.txt", "w");
for (int i = 0; i < NUMITERATIONS; ++i) {
fprintf(file, "[%f:%f]\n", buffer[i], buffer[i] - tmp);
tmp = buffer[i] + i;
}
fclose(file);
#endif
return rdtsc() - t;
}
long long test_zlib_transparent(double *buffer){
long long t = rdtsc();
#ifdef USE_ZLIB
double tmp = 0;
gzFile file = gzopen("zlib_file.txt.gz", "wT");
for (int i = 0; i < NUMITERATIONS; ++i) {
gzprintf(file, "[%f:%f]\n", buffer[i], buffer[i] - tmp);
tmp = buffer[i] + i;
}
gzclose(file);
#endif
return rdtsc() - t;
}
int main(){
std::cout << "Performance fprintf vs gzprintf (transparent):" << std::endl;
long long dPrint = test_fprintf(buffer);
std::cout << " fprintf " << dPrint << std::endl;
long long dStream = test_zlib_transparent(buffer);
std::cout << "zLib transp " << dStream << std::endl;
std::cout << "ratio " << double(dStream)/double(dPrint) << std::endl;
return 0;
}
建造:
g++ -g -O3 -DUSE_ZLIB=1 -DUSE_FPRINTF=1 zlib_transparent.cpp -o zlib_transparent –lz
谢谢
谢尔盖
我的错。 (我写了gzprintf()
。)
write()
调用过于频繁。如果将 fprintf()
替换为 snprintf()
和 write()
.
我会在下一个版本的 zlib 中改进这个。如果您想尝试,请申请 this diff。我不知道它将如何在 Linux 上执行,但是在 Mac OS X 上,透明模式下的 gzprintf()
现在快 10% 比 fprintf()
。 (没想到。)