view test/runtime/7158800/InternTest.java @ 2981:96ba7edfedfa icedtea-2.1.3

7158800: Improve storage of symbol tables Summary: Use an alternate version of hashing algorithm for symbol string tables and after a certain bucket size to improve performance Reviewed-by: pbk, kamg, dlong, kvn, fparain
author coleenp
date Wed, 17 Oct 2012 08:52:25 +0100
parents
children
line wrap: on
line source

/*
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug 7158800
 * @run shell/timeout=400 Test7158800.sh
 * @summary This test performs poorly if alternate hashing isn't used for
 * string table.
 * The timeout is handled by the shell file (which kills the process)
 */
import java.util.*;
import java.io.*;

public class InternTest {
    public static void main (String args[]) throws Exception {
        final String badStringsFilename = "badstrings.txt";

        if (args.length == 0 || (!args[0].equals("bad") && !args[0].equals("normal"))) {
            System.out.println("Usage:  java InternTest [normal|bad]");
            System.exit(1);
        }

        FileInputStream fstream = new FileInputStream(badStringsFilename);
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String toIntern, toDiscard;
        int count = 0;
        long current = 0L;
        long last = System.currentTimeMillis();

        if (args[0].equals("bad")) {
            while ((toIntern = br.readLine()) != null) {
                toDiscard = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString());
                toIntern.intern();
                count++;
                if (count % 10000 == 0 && count != 0) {
                    current = System.currentTimeMillis();
                    System.out.println(new Date(current) + ": interned " + count + " 0-hash strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)");
                    last = current;
                }
            }
        }
        if (args[0].equals("normal")) {
            while ((toDiscard = br.readLine()) != null) { // do the same read from the file to try and make the test fair
                toIntern = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString());
                toIntern.intern();
                count++;
                if (count % 10000 == 0 && count != 0) {
                    current = System.currentTimeMillis();
                    System.out.println(new Date(current) + ": interned " + count + " normal strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)");
                    last = current;
                }
            }
        }
        in.close();
    }
}