/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.lab.java;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* Created by The eXo Platform SAS Author : Peter Nedonosko peter.nedonosko@exoplatform.com.ua
* 09.11.2007
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: TestStringLongComparison.java 11907 2008-03-13 15:36:21Z ksm $
*/
public class TestStringLongComparison extends TestCase
{
public static final int RECORDS_COUNT = 1000;
class Id
{
final static int LONG_STRING_LENGTH = 16;
final static int ID_STRING_LENGTH = LONG_STRING_LENGTH * 2;
final UUID id;
Id()
{
id = UUID.randomUUID();
}
private String trailZeros(String hex)
{
if (hex.length() < LONG_STRING_LENGTH)
{
int d = LONG_STRING_LENGTH - hex.length();
char[] zrs = new char[d];
Arrays.fill(zrs, '0');
return new String(zrs) + hex;
}
return hex;
}
private String string(UUID id)
{
String msb = trailZeros(Long.toHexString(id.getMostSignificantBits()));
String lsb = trailZeros(Long.toHexString(id.getLeastSignificantBits()));
return msb + lsb;
}
@Override
public boolean equals(Object obj)
{
return obj instanceof Id ? id.equals(((Id)obj).id) : false;
}
@Override
public int hashCode()
{
return id.hashCode();
}
@Override
public String toString()
{
return string(id);
}
}
private String memoryInfo() throws Exception
{
runGC();
String info = "";
info =
"free: " + mb(Runtime.getRuntime().freeMemory()) + "M of " + mb(Runtime.getRuntime().totalMemory())
+ "M (max: " + mb(Runtime.getRuntime().maxMemory()) + "M)";
return info;
}
private String mb(long mem)
{
return String.valueOf(Math.round(mem * 100d / (1024d * 1024d)) / 100d);
}
// =========== http://www.javaworld.com/javaworld/javatips/jw-javatip130.html ===========
private static void runGC() throws Exception
{
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r < 4; ++r)
_runGC();
}
private static long usedMemory()
{
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
private static void _runGC() throws Exception
{
long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i)
{
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
private static final Runtime s_runtime = Runtime.getRuntime();
// =======================================================================================
private static Boolean gcInit = false;
@Override
protected void setUp() throws Exception
{
if (!gcInit)
{
runGC();
gcInit = true;
}
}
public void testUUIDInMap() throws Exception
{
Map<Id, Integer> select = new HashMap<Id, Integer>();
Map<Id, Integer> all = new HashMap<Id, Integer>();
long start = System.currentTimeMillis();
for (int i = 1; i <= RECORDS_COUNT; i++)
{
Id id = new Id();
all.put(id, i);
if (i % 100 == 0)
select.put(id, i);
}
long d = (System.currentTimeMillis() - start);
double avg = Math.round(d * 1000d / RECORDS_COUNT) / 1000d;
System.out.println("Puts done " + getName() + " items:" + RECORDS_COUNT + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo());
start = System.currentTimeMillis();
for (Map.Entry<Id, Integer> ide : select.entrySet())
{
Id id = ide.getKey();
Integer i = all.get(id);
assertEquals("Indexes should be same", ide.getValue(), i);
// System.out.println("Get id:" + id.toString() + " -- " + i);
}
d = (System.currentTimeMillis() - start);
avg = Math.round(d * 1000d / select.size()) / 1000d;
System.out.println("Gets done " + getName() + " items:" + select.size() + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo() + "\n");
}
public void testUUIDInList() throws Exception
{
Map<Id, Integer> select = new HashMap<Id, Integer>();
List<Id> all = new ArrayList<Id>();
long start = System.currentTimeMillis();
for (int i = 0; i < RECORDS_COUNT; i++)
{
Id id = new Id();
all.add(id);
if (i % 100 == 0)
select.put(id, i);
}
long d = (System.currentTimeMillis() - start);
double avg = Math.round(d * 1000d / RECORDS_COUNT) / 1000d;
System.out.println("Adds done " + getName() + " items:" + RECORDS_COUNT + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo());
start = System.currentTimeMillis();
for (Map.Entry<Id, Integer> ide : select.entrySet())
{
Integer i = all.indexOf(ide.getKey());
assertEquals("Indexes should be same", ide.getValue(), i);
// System.out.println("Get id:" + id.toString() + " -- " + i);
}
d = (System.currentTimeMillis() - start);
avg = Math.round(d * 1000d / select.size()) / 1000d;
System.out.println("Gets done " + getName() + " items:" + select.size() + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo() + "\n");
}
public void testStringInMap() throws Exception
{
Map<String, Integer> select = new HashMap<String, Integer>();
Map<String, Integer> all = new HashMap<String, Integer>();
long start = System.currentTimeMillis();
for (int i = 1; i <= RECORDS_COUNT; i++)
{
String id = new Id().toString();
all.put(id, i);
if (i % 100 == 0)
select.put(new String(id.toCharArray()), i);
}
long d = (System.currentTimeMillis() - start);
double avg = Math.round(d * 1000d / RECORDS_COUNT) / 1000d;
System.out.println("Puts done " + getName() + " items:" + RECORDS_COUNT + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo());
start = System.currentTimeMillis();
for (Map.Entry<String, Integer> ide : select.entrySet())
{
String id = ide.getKey();
Integer i = all.get(id);
assertEquals("Indexes should be same", ide.getValue(), i);
// System.out.println("Get id:" + id.toString() + " -- " + i);
}
d = (System.currentTimeMillis() - start);
avg = Math.round(d * 1000d / select.size()) / 1000d;
System.out.println("Gets done " + getName() + " items:" + select.size() + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo() + "\n");
}
public void testStringInList() throws Exception
{
Map<String, Integer> select = new HashMap<String, Integer>();
List<String> all = new ArrayList<String>();
long start = System.currentTimeMillis();
for (int i = 0; i < RECORDS_COUNT; i++)
{
String id = new Id().toString();
all.add(id);
if (i % 100 == 0)
select.put(id, i);
}
long d = (System.currentTimeMillis() - start);
double avg = Math.round(d * 1000d / RECORDS_COUNT) / 1000d;
System.out.println("Adds done " + getName() + " items:" + RECORDS_COUNT + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo());
start = System.currentTimeMillis();
for (Map.Entry<String, Integer> ide : select.entrySet())
{
Integer i = all.indexOf(ide.getKey());
assertEquals("Indexes should be same", ide.getValue(), i);
// System.out.println("Get id:" + id.toString() + " -- " + i);
}
d = (System.currentTimeMillis() - start);
avg = Math.round(d * 1000d / select.size()) / 1000d;
System.out.println("Gets done " + getName() + " items:" + select.size() + ", time:" + d + "ms, avg.time:" + avg
+ "ms, " + memoryInfo() + "\n");
}
}