1 /*
2  * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 
25 /* @test
26  * @bug 7109837
27  * @summary Test Adler32/CRC32.update(ByteBuffer)
28  * @key randomness
29  */
30 
31 import java.util.*;
32 import java.util.zip.*;
33 import java.nio.*;
34 
35 public class TimeChecksum {
36 
time(Adler32 adler32, byte[] data, int iters, int len)37     static long time(Adler32 adler32, byte[] data, int iters, int len) {
38         long start_t = System.nanoTime();
39         for (int i = 0; i < iters; i++) {
40             adler32.reset();
41             adler32.update(data, 0, len);
42         }
43         long t = System.nanoTime() - start_t;
44         System.out.printf("%,12d", t / len);
45         return t;
46     }
47 
time(Adler32 adler32, ByteBuffer buf, int iters)48     static long time(Adler32 adler32, ByteBuffer buf, int iters) {
49         long start_t = System.nanoTime();
50         for (int i = 0; i < iters; i++) {
51             adler32.reset();
52             buf.mark();
53             adler32.update(buf);
54             buf.reset();
55         }
56         long t = System.nanoTime() - start_t;
57         System.out.printf("%,12d", t / buf.remaining());
58         return t;
59     }
60 
testPosLimit(Adler32 adler32, ByteBuffer buf)61     static void testPosLimit(Adler32 adler32, ByteBuffer buf) {
62         int pos = buf.position();
63         int limit = buf.limit();
64         adler32.update(buf);
65         if (limit != buf.position() || limit != buf.limit()) {
66             System.out.printf("%nFAILED: pos,limit=(%d, %d), expected (%d, %d)%n",
67                     buf.position(), buf.limit(), limit, limit);
68             throw new RuntimeException();
69         }
70         buf.position(pos);
71     }
72 
time(CRC32 crc32, byte[] data, int iters, int len)73     static long time(CRC32 crc32, byte[] data, int iters, int len) {
74         long start_t = System.nanoTime();
75         for (int i = 0; i < iters; i++) {
76             crc32.reset();
77             crc32.update(data, 0, len);
78         }
79         long t = System.nanoTime() - start_t;
80         System.out.printf("%,12d", t / len);
81         return t;
82     }
83 
time(CRC32 crc32, ByteBuffer buf, int iters)84     static long time(CRC32 crc32, ByteBuffer buf, int iters) {
85         long start_t = System.nanoTime();
86         for (int i = 0; i < iters; i++) {
87             crc32.reset();
88             buf.mark();
89             crc32.update(buf);
90             buf.reset();
91         }
92         long t = System.nanoTime() - start_t;
93         System.out.printf("%,12d", t / buf.remaining());
94         return t;
95     }
96 
testPosLimit(CRC32 crc32, ByteBuffer buf)97     static void testPosLimit(CRC32 crc32, ByteBuffer buf) {
98         int pos = buf.position();
99         int limit = buf.limit();
100         crc32.update(buf);
101         if (limit != buf.position() || limit != buf.limit()) {
102             System.out.printf("%nFAILED: pos,limit=(%d, %d), expected (%d, %d)%n",
103                     buf.position(), buf.limit(), limit, limit);
104             throw new RuntimeException();
105         }
106         buf.position(pos);
107     }
108 
main(String[] args)109     public static void main(String[] args) {
110         int len     = 1024 * 32;
111         int iters   = 1;
112         if (args.length != 0 && "-benchmark".equals(args[0]))
113             iters = 100000;
114         Adler32 adler32 = new Adler32();
115         CRC32 crc32 = new CRC32();
116         Random rdm = new Random();
117         byte[] data = new byte[len];
118         new Random().nextBytes(data);
119         ByteBuffer buf;
120 
121         System.out.println("---------- Adler32 ----------");
122         System.out.print("Warmup...");
123         time(adler32, data, iters, len);
124         time(adler32, ByteBuffer.wrap(data), iters);
125         buf = ByteBuffer.allocateDirect(len);
126         buf.put(data, 0, len);
127         buf.flip();
128         time(adler32, buf, iters);
129         System.out.println("\n");
130 
131         System.out.println("Length    byte[](ns/len)  ByteBuffer(direct)   ByteBuffer");
132         for (int testlen = 1; testlen < data.length; testlen <<= 1) {
133             System.out.print(testlen + "\t");
134             long baT = time(adler32, data, iters, testlen);
135             long baV = adler32.getValue();
136             System.out.print("\t");
137 
138             buf = ByteBuffer.allocateDirect(testlen);
139             buf.put(data, 0, testlen);
140             buf.flip();
141             long bbdT = time(adler32, buf, iters);
142             long bbdV = adler32.getValue();
143             if (baV != bbdV) {
144                 System.out.printf("%nFAILED: baV=%x,bbdV=%x%n", baV, bbdV);
145                 throw new RuntimeException();
146             }
147             System.out.printf(" (%.2f)", (float)bbdT/baT);
148             testPosLimit(adler32, buf);
149 
150             buf = ByteBuffer.allocate(testlen);
151             buf.put(data, 0, testlen);
152             buf.flip();
153             long bbT = time(adler32, buf, iters);
154             long bbV = adler32.getValue();
155             if (baV != bbV) {
156                 System.out.printf("%nFAILED: baV=%x,bbV=%x%n", baV, bbV);
157                 throw new RuntimeException();
158             }
159             testPosLimit(adler32, buf);
160             System.out.printf(" (%.2f)     checksum=%x%n", (float)bbT/baT, bbV);
161         }
162 
163         System.out.println("\n---------- CRC32 ----------");
164         System.out.print("Warmup...");
165         time(crc32, data, iters, len);
166         time(crc32, ByteBuffer.wrap(data), iters);
167         buf = ByteBuffer.allocateDirect(len);
168         buf.put(data, 0, len);
169         buf.flip();
170         time(crc32, buf, iters);
171         System.out.println("\n");
172 
173 
174         System.out.println("Length    byte[](ns/len)  ByteBuffer(direct)   ByteBuffer");
175         for (int testlen = 1; testlen < data.length; testlen <<= 1) {
176             System.out.print(testlen + "\t");
177             long baT = time(crc32, data, iters, testlen);
178             long baV = crc32.getValue();
179             System.out.print("\t");
180 
181             buf = ByteBuffer.allocateDirect(testlen);
182             buf.put(data, 0,  testlen);
183             buf.flip();
184             long bbdT = time(crc32, buf, iters);
185             long bbdV = crc32.getValue();
186             if (baV != bbdV) {
187                 System.out.printf("%nFAILED: baV=%x,bbdV=%x%n", baV, bbdV);
188                 throw new RuntimeException();
189             }
190             System.out.printf(" (%.2f)", (float)bbdT/baT);
191             testPosLimit(crc32, buf);
192 
193             buf = ByteBuffer.allocate(testlen);
194             buf.put(data, 0, testlen);
195             buf.flip();
196             long bbT = time(crc32, buf, iters);
197             long bbV = crc32.getValue();
198             if (baV != bbV) {
199                 System.out.printf("%nFAILED: baV=%x,bbV=%x%n", baV, bbV);
200                 throw new RuntimeException();
201             }
202             testPosLimit(crc32, buf);
203             System.out.printf(" (%.2f)     checksum=%x%n", (float)bbT / baT, bbV);
204         }
205     }
206 }
207