java c s测试_将Zlib Java与C进行基准测试
我试图通过切换到C来加快最初用Java编写的TIFF编码器的速度,并已编译了Zlib 1.2.8,其中定义了Z_SOLO并包含最少的C文件集:adler32.c,crc32.c,deflate.c,< x4>和zutil.c。 Java正在使用java.util.zip.Deflater。
我编写了一个简单的测试程序来评估压缩级别和速度方面的性能,但我感到困惑的是,无论我需要什么级别,考虑到更高级别所需的时间越来越长,压缩都不会发挥太大作用。 Java在压缩和速度方面的性能都比Visual Studio Release-compile(VC2010)更好,我也对此感到惊讶:
Java:
Level 1 : 8424865 => 6215200 (73,8%) in 247 cycles.
Level 2 : 8424865 => 6178098 (73,3%) in 254 cycles.
Level 3 : 8424865 => 6181716 (73,4%) in 269 cycles.
Level 4 : 8424865 => 6337236 (75,2%) in 334 cycles.
Level 5 : 8424865 => 6331902 (75,2%) in 376 cycles.
Level 6 : 8424865 => 6333914 (75,2%) in 395 cycles.
Level 7 : 8424865 => 6333350 (75,2%) in 400 cycles.
Level 8 : 8424865 => 6331986 (75,2%) in 437 cycles.
Level 9 : 8424865 => 6331598 (75,2%) in 533 cycles.
C:
Level 1 : 8424865 => 6215586 (73.8%) in 298 cycles.
Level 2 : 8424865 => 6195280 (73.5%) in 309 cycles.
Level 3 : 8424865 => 6182748 (73.4%) in 331 cycles.
Level 4 : 8424865 => 6337942 (75.2%) in 406 cycles.
Level 5 : 8424865 => 6339203 (75.2%) in 457 cycles.
Level 6 : 8424865 => 6337100 (75.2%) in 481 cycles.
Level 7 : 8424865 => 6336396 (75.2%) in 492 cycles.
Level 8 : 8424865 => 6334293 (75.2%) in 547 cycles.
Level 9 : 8424865 => 6333084 (75.2%) in 688 cycles.
我是唯一看到这种结果的人吗?我的猜测是JVM中的Zlib正在使用我不包含在我的C项目中的程序集类型优化,或者在编译Zlib(或Visual Studio编译器很烂)时缺少一个明显的配置步骤。
这两个片段:
Java:
public static void main(String[] args) throws IOException {
byte[] pix = Files.readAllBytes(Paths.get("MY_MOSTLY_UNCOMPRESSED.TIFF"));
int szin = pix.length;
byte[] buf = new byte[szin*101/100];
int szout;
long t0, t1;
for (int i = 1; i <= 9; i++) {
t0 = System.currentTimeMillis();
Deflater deflater = new Deflater(i);
deflater.setInput(pix);
szout = deflater.deflate(buf);
deflater.finish();
t1 = System.currentTimeMillis();
System.out.println(String.format("Level %d : %d => %d (%.1f%%) in %d cycles.", i, szin, szout, 100.0f*szout/szin, t1 - t0));
}
}
C:
#include
#define SZIN 9000000
#define SZOUT 10000000
void main(void)
{
static unsigned char buf[SZIN];
static unsigned char out[SZOUT];
clock_t t0, t1;
int i, ret;
uLongf sz, szin;
FILE* f = fopen("MY_MOSTLY_UNCOMPRESSED.TIFF","rb");
szin = fread(buf, 1, SZIN, f);
fclose(f);
for (i = 1; i <= 9; i++) {
sz = SZOUT;
t0 = clock();
compress2(out, &sz, buf, szin, i); // I rewrote compress2, as it's not available when Z_SOLO is defined
t1 = clock();
printf("Level %d : %d => %d (%.1f%%) in %ld cycles.\
", i, szin, sz, 100.0f*sz/szin, t1 - t0);
}
}
编辑:
@MarkAdler发表评论后,我尝试通过deflateInit2()(即Z_FILTERED和Z_HUFFMAN_ONLY)使用不同的压缩策略:
Z_FILTERED:
Level 1 : 8424865 => 6215586 (73.8%) in 299 cycles.
Level 2 : 8424865 => 6195280 (73.5%) in 310 cycles.
Level 3 : 8424865 => 6182748 (73.4%) in 330 cycles.
Level 4 : 8424865 => 6623409 (78.6%) in 471 cycles.
Level 5 : 8424865 => 6604616 (78.4%) in 501 cycles.
Level 6 : 8424865 => 6595698 (78.3%) in 528 cycles.
Level 7 : 8424865 => 6594845 (78.3%) in 536 cycles.
Level 8 : 8424865 => 6592863 (78.3%) in 595 cycles.
Level 9 : 8424865 => 6591118 (78.2%) in 741 cycles.
Z_HUFFMAN_ONLY:
Level 1 : 8424865 => 6803043 (80.7%) in 111 cycles.
Level 2 : 8424865 => 6803043 (80.7%) in 108 cycles.
Level 3 : 8424865 => 6803043 (80.7%) in 106 cycles.
Level 4 : 8424865 => 6803043 (80.7%) in 106 cycles.
Level 5 : 8424865 => 6803043 (80.7%) in 107 cycles.
Level 6 : 8424865 => 6803043 (80.7%) in 106 cycles.
Level 7 : 8424865 => 6803043 (80.7%) in 107 cycles.
Level 8 : 8424865 => 6803043 (80.7%) in 108 cycles.
Level 9 : 8424865 => 6803043 (80.7%) in 107 cycles.
正如他的评论所期望的那样,Z_HUFFMAN_ONLY不会更改压缩,但是执行速度要快得多。根据我的数据,Z_FILTERED的压缩速度并没有比Z_DEFAULT_STRATEGY快一些。
我很惊讶级别3最小。您确定数据没有什么奇怪的地方吗?
@PeterLawrey是一个"标准" TIFF文件,大小为2800x2900,包含2页,第一页未压缩,第二页进行deflate压缩。我可以理解为"压缩压缩数据使它们膨胀"。我可以尝试压缩已经压缩的数据,以查看发生了什么(如果我在本周末有时间)。
在Java程序中,请注意fis.read(pix)可能无法读取整个文件,在这种情况下,pix的其余部分将为零。我建议用pix = Files.readAllBytes(Paths.get("MY_MOSTLY_UNCOMPRESSED.TIFF"))代替FileInputStream的使用。
您获得的压缩量取决于数据。大多数图像文件已经被很大程度地压缩,因此您不太可能会看到太多额外的压缩。
@VGR感谢您的提示。在我的quickndirty测试中,我确保缓冲区足够大,并且似乎读取了所有字节(与C中的数字相同)。
确实是@HotLicks。但是我期望随着level的增加,压缩会越来越好,而不是立即看到" max-I-can-get",而没有得到很大的改善(正如@PeterLawrey注意到的那样,它令人惊讶地从0下降到3,然后上升从4点开始,然后下降一点)。
不奇怪。每个"级别"是不同的算法,并且某些"级别"在给定数据上的效果更好(或者在这种情况下,开销可能更小)。
@Matthieu您是否尝试过使unsigned chars无符号ints?每次将其装入时,都必须将其转换为int。这样可以加快速度。
@progenhard Zlib期望使用unsigned char*指针(在Zlib中为Bytef*),考虑到图像的大小(和数量),内存增加4倍并不值得Zlib骇客。
对于基本上没有匹配字符串的未压缩图像数据,压缩量和增量并不奇怪。 压缩的数据部分不会进一步压缩-只是以一定的数量进行扩展,因此变化全部在未压缩的部分上。
3级和4级之间的算法有所不同,其中3级用于它找到的第一个匹配项。 当几乎没有匹配的字符串时,这将使发送字符串匹配的开销最小化,因此压缩效果更好。 如果使用FILTERED或HUFFMAN_ONLY完全关闭了字符串匹配,则可能会做得更好。 HUFFMAN_ONLY还具有甚至不寻找匹配字符串的优点,从而大大加快了压缩速度。
至于速度差异,我只能猜测使用了不同的编译器或不同的编译器优化。
HUFMAN_ONLY也可以在Java中设置吗?
实际上,HUFFMAN_ONLY是setStrategy的Java选项。 在zlib中,它称为Z_HUFFMAN。
谢谢,这解释了原因。 如果有时间,请尝试使用FILTERED和HUFFMAN_ONLY并发布结果。
我用Z_FILTERED和Z_HUFFMAN_ONLY获得的结果更新了帖子。 我喜欢Z_HUFFMAN_ONLY策略仍然可以由JAI(TIFF读取器Im使用)解码,尽管它在测试斜坡图像(0、1、2、3,...,254、255)上完全没有压缩 ,0,...),在实际示例中仍可提供80%的压缩率。 感谢您为开发该产品所做的辛勤工作!
java c s测试_将Zlib Java与C进行基准测试相关推荐
- java 集成开发工具_最好的Java开发人员测试和集成工具
java 集成开发工具 通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控. 参加AppDynamics APM导览! 无论您是刚刚起步还是已经从事了一段时间,使用正确的工具进行编程都可 ...
- java 扫描文件测试_适用于Java开发人员的微服务:安全测试和扫描
java 扫描文件测试 1.简介 本教程的这一部分专门讨论安全性测试,将围绕被证明在软件开发领域(包括微服务 )中无价的测试策略进行总结. 尽管软件项目中的安全方面每天都变得越来越重要,但是令人惊讶的 ...
- java程序启动命令_如何用java启动windows命令行程序
先请编译和运行下面程序: import java.util.*; import java.io.*; public class BadExecJavac2 { public static void m ...
- java获取机器号_(转)JAVA获得机器码的实现
http://yangshangchuan.iteye.com/blog/2012401 首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换: Java代码 收藏代码 /** *生成机 ...
- java整数的因式分解_如何在Java中找到整数的质数-因式分解
java整数的因式分解 编程课程中的常见家庭作业/任务之一是关于Prime Factorization. 要求您编写一个程序以找到给定整数的素因子 . 一个数字的素数因子是将精确地除以给定数字的所有素 ...
- java 配置文件的路径_详解java配置文件的路径问题
详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...
- 新手学java 学哪方面_初学者学Java应从哪些方面学习?
原标题:初学者学Java应从哪些方面学习? Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.那么,初学者学Java应从哪些方面学 ...
- java 反射 动态编译_动态编译java源代码和反射调用问题
我从教程中得到了以下代码: package com.tom.labs; import java.io.IOException; import java.lang.reflect.Method; imp ...
- java加载机制_详解Java类加载机制
一:ClassLoader 从JVM结构图中可以看到,类加载器的作用是将Java类文件加载到Java虚拟机. HotSpot JVM结构,图片来自Java Garbage Collection Bas ...
最新文章
- C# 多线程学习总结
- android 记一次富文本加载之路
- Linux下安装 mxnet
- CALL注入--扫雷辅助(二)
- sql文件中捕获异常_使用更改数据捕获监视SQL Server中的更改
- Linux环境下FTP工具的使用方法
- Android调用系统发送短信界面
- Undefined control sequence.l.113 \LinesNumbered
- java----内省
- 华为机顶盒视频播放代码
- win10电脑切换窗口输入法总是变换怎么办?
- Windows 程序注册表常用键名——CurrentVersion
- Codeforces - Array Queries
- 硬方案——从数据采样到滤波要求,一步一步教你设计“抗混叠滤波器”
- 虚拟机服务器负荷,虚拟机中服务的负荷评估和负载均衡方法
- 360桌面助手待办事项同步/迁移的方法(从一台电脑迁移到另外一台电脑上)
- java全栈系列之JavaSE--java中的多维数组的详解026
- php 传智播客 学习内容
- C语言与离散数学的结合--逻辑推理
- leetcode974. 和可被 K 整除的子数组
热门文章
- 17、Java Swing Timer:计时器组件
- 使用元数据分析数据库
- 显示Linux系统执行的进程
- C++之抽象基类与纯虚函数
- 建基小型计算机,建碁AOpenminiITX小型化平台应用(44页)-原创力文档
- ospf hello时间和dead_使用OSPF协议使SPOKE端正常通信
- 三级数据库还是linux好,08年计算机三级数据库辅导:如何修改Linux下MySQL5.0的默认连接数...
- 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)
- 网页加载出现没有合适的负载均衡器_gRPC实战--Kubernetes中使用envoy负载均衡gRPC流量...
- python discuz_python实现的登陆Discuz!论坛通用代码分享