|
@@ -1,259 +0,0 @@
|
|
|
-/*
|
|
|
- * $Header: IDFactoryTest.java, 26/08/2005 01:04:53 luisantonioa Exp $
|
|
|
- *
|
|
|
- * $Author: luisantonioa $
|
|
|
- * $Date: 26/08/2005 01:04:53 $
|
|
|
- * $Revision: 1 $
|
|
|
- * $Log: IDFactoryTest.java,v $
|
|
|
- * Revision 1 26/08/2005 01:04:53 luisantonioa
|
|
|
- * Added copyright notice
|
|
|
- *
|
|
|
- * This program is free software: you can redistribute it and/or modify it under
|
|
|
- * the terms of the GNU General Public License as published by the Free Software
|
|
|
- * Foundation, either version 3 of the License, or (at your option) any later
|
|
|
- * version.
|
|
|
- *
|
|
|
- * This program 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 for more
|
|
|
- * details.
|
|
|
- *
|
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
|
- * this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
- */
|
|
|
-package com.l2jserver.gameserver.idfactory;
|
|
|
-
|
|
|
-import java.util.Vector;
|
|
|
-import java.util.concurrent.CountDownLatch;
|
|
|
-import java.util.concurrent.atomic.AtomicInteger;
|
|
|
-
|
|
|
-import junit.framework.TestCase;
|
|
|
-
|
|
|
-import com.l2jserver.Config;
|
|
|
-import com.l2jserver.Config.IdFactoryType;
|
|
|
-import com.l2jserver.Server;
|
|
|
-import com.l2jserver.util.Rnd;
|
|
|
-
|
|
|
-/**
|
|
|
- * This class ...
|
|
|
- *
|
|
|
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
|
|
|
- */
|
|
|
-
|
|
|
-public class IDFactoryTest extends TestCase
|
|
|
-{
|
|
|
- private static final boolean _debug = false;
|
|
|
-
|
|
|
- // Compaction, BitSet, Stack, (null to use config)
|
|
|
- private static final IdFactoryType FORCED_TYPE = IdFactoryType.Stack;
|
|
|
-
|
|
|
- protected IdFactory _idFactory;
|
|
|
- protected AtomicInteger _count = new AtomicInteger(0), _adds = new AtomicInteger(0), _removes = new AtomicInteger(0);
|
|
|
-
|
|
|
- protected static final int REQUESTER_THREADS = 50;
|
|
|
- protected static final int REQUESTER_THREAD_REQUESTS = 1000;
|
|
|
- protected static final int REQUESTER_THREAD_RANDOM_DELAY = 30;
|
|
|
- protected static final int RELEASER_THREADS = 50;
|
|
|
- protected static final int RELEASER_THREAD_RELEASES = 1000;
|
|
|
- protected static final int RELEASER_THREAD_RANDOM_DELAY = 35;
|
|
|
-
|
|
|
- private static final long F_SLEEP_INTERVAL = 100;
|
|
|
-
|
|
|
- CountDownLatch _latch = new CountDownLatch(REQUESTER_THREADS + RELEASER_THREADS);
|
|
|
- protected static Vector<Integer> _map = new Vector<Integer>();
|
|
|
-
|
|
|
- public static void main(String[] args)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Constructor for IDFactoryTest.
|
|
|
- * @param arg0
|
|
|
- */
|
|
|
- public IDFactoryTest(String arg0)
|
|
|
- {
|
|
|
- super(arg0);
|
|
|
- Server.serverMode = Server.MODE_GAMESERVER;
|
|
|
- Config.load();
|
|
|
- if(FORCED_TYPE != null)
|
|
|
- Config.IDFACTORY_TYPE = FORCED_TYPE;
|
|
|
- _idFactory = IdFactory.getInstance();
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * @see TestCase#setUp()
|
|
|
- */
|
|
|
- @Override
|
|
|
- protected void setUp() throws Exception
|
|
|
- {
|
|
|
- super.setUp();
|
|
|
- System.out.println("Initial Free ID's: "+IdFactory.FREE_OBJECT_ID_SIZE);
|
|
|
- System.out.println("IdFactoryType: "+Config.IDFACTORY_TYPE.name());
|
|
|
- /*long startMemoryUse = getMemoryUse();
|
|
|
- BitSet freeIds = new BitSet(0x6FFFFFFF);
|
|
|
- long endMemoryUse = getMemoryUse();
|
|
|
- freeIds.clear();
|
|
|
- long approximateSize = ( endMemoryUse - startMemoryUse ) / (1024*1024);
|
|
|
-
|
|
|
- System.out.println("Size: "+approximateSize+"Mb.");*/
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * @see TestCase#tearDown()
|
|
|
- */
|
|
|
- @Override
|
|
|
- protected void tearDown() throws Exception
|
|
|
- {
|
|
|
- super.tearDown();
|
|
|
- _idFactory = null;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Test method for 'com.l2jserver.gameserver.idfactory.IdFactory.getNextId()'
|
|
|
- */
|
|
|
- public final void testFactory()
|
|
|
- {
|
|
|
- System.out.println("Free ID's: "+_idFactory.size());
|
|
|
- System.out.println("Used ID's: "+(IdFactory.FREE_OBJECT_ID_SIZE - _idFactory.size()));
|
|
|
- _map.add(_idFactory.getNextId());
|
|
|
- for (int i=0; i<REQUESTER_THREADS; i++)
|
|
|
- {
|
|
|
- new Thread(new RequestID(), "Request-Thread-"+i).start();
|
|
|
- }
|
|
|
- for (int i=0; i<RELEASER_THREADS; i++)
|
|
|
- {
|
|
|
- new Thread(new ReleaseID(), "Release-Thread-"+i).start();
|
|
|
- }
|
|
|
- try
|
|
|
- {
|
|
|
- _latch.await();
|
|
|
- }
|
|
|
- catch (InterruptedException e)
|
|
|
- {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- System.out.println("Free ID's: "+_idFactory.size());
|
|
|
- System.out.println("Used ID's: "+(IdFactory.FREE_OBJECT_ID_SIZE - _idFactory.size()));
|
|
|
- System.out.println("Count: "+_count.get());
|
|
|
- }
|
|
|
-
|
|
|
- public class RequestID implements Runnable
|
|
|
- {
|
|
|
- long _time1;
|
|
|
- long _time2;
|
|
|
- AtomicInteger _myCount = new AtomicInteger(0);
|
|
|
- @Override
|
|
|
- public void run()
|
|
|
- {
|
|
|
- for (int i=0; i<REQUESTER_THREAD_REQUESTS; i++)
|
|
|
- {
|
|
|
- synchronized (_map)
|
|
|
- {
|
|
|
- _time1 = System.nanoTime();
|
|
|
- int newId = _idFactory.getNextId();
|
|
|
- _time2 = System.nanoTime() - _time1;
|
|
|
- _count.incrementAndGet();
|
|
|
- _adds.incrementAndGet();
|
|
|
- _myCount.incrementAndGet();
|
|
|
- _map.add(newId);
|
|
|
- if (_debug) System.out.println("Got new ID "+newId);
|
|
|
- if (Rnd.nextInt(10) == 0)
|
|
|
- {
|
|
|
- System.out.println(" Total ID requests: "+_adds.get()+". "+_time2+"ns");
|
|
|
- }
|
|
|
- }
|
|
|
- try
|
|
|
- {
|
|
|
- Thread.sleep(Rnd.nextInt(REQUESTER_THREAD_RANDOM_DELAY));
|
|
|
- }
|
|
|
- catch (InterruptedException e)
|
|
|
- {
|
|
|
- System.out.println(Thread.currentThread().getName()+" was Interupted.");
|
|
|
- }
|
|
|
- }
|
|
|
- if (_debug) System.out.println(getName()+ " myCount is "+_myCount.get()+"/100.");
|
|
|
- _latch.countDown();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- public class ReleaseID implements Runnable
|
|
|
- {
|
|
|
- AtomicInteger _myCount = new AtomicInteger(100);
|
|
|
- long _time1;
|
|
|
- long _time2;
|
|
|
- @Override
|
|
|
- public void run()
|
|
|
- {
|
|
|
- for (int i=0; i<RELEASER_THREAD_RELEASES; i++)
|
|
|
- {
|
|
|
- synchronized (_map)
|
|
|
- {
|
|
|
- int size = _map.size();
|
|
|
- if (_map.size() <= 0)
|
|
|
- {
|
|
|
- i--;
|
|
|
- continue;
|
|
|
- }
|
|
|
- //if (size > 0)
|
|
|
- //{
|
|
|
- int pos = Rnd.nextInt(size);
|
|
|
- int id = _map.get(pos);
|
|
|
- _time1 = System.nanoTime();
|
|
|
- _idFactory.releaseId(id);
|
|
|
- _time2 = System.nanoTime() - _time1;
|
|
|
- _map.remove(pos);
|
|
|
- _count.decrementAndGet();
|
|
|
- _myCount.decrementAndGet();
|
|
|
- _removes.incrementAndGet();
|
|
|
- if (_debug) System.out.println("Released ID "+id);
|
|
|
- if (Rnd.nextInt(10) == 0)
|
|
|
- {
|
|
|
- System.out.println("Total ID releases: "+_removes.get()+". "+_time2+"ns");
|
|
|
- }
|
|
|
- //}
|
|
|
- }
|
|
|
- try
|
|
|
- {
|
|
|
- Thread.sleep(Rnd.nextInt(RELEASER_THREAD_RANDOM_DELAY));
|
|
|
- }
|
|
|
- catch (InterruptedException e)
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- if (_debug) System.out.println(getName()+ " count is "+_myCount.get()+"/100.");
|
|
|
-
|
|
|
- _latch.countDown();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @SuppressWarnings("unused")
|
|
|
- private static long getMemoryUse(){
|
|
|
- putOutTheGarbage();
|
|
|
- long totalMemory = Runtime.getRuntime().totalMemory();
|
|
|
-
|
|
|
- putOutTheGarbage();
|
|
|
- long freeMemory = Runtime.getRuntime().freeMemory();
|
|
|
-
|
|
|
- return (totalMemory - freeMemory);
|
|
|
- }
|
|
|
-
|
|
|
- private static void putOutTheGarbage() {
|
|
|
- collectGarbage();
|
|
|
- collectGarbage();
|
|
|
- }
|
|
|
-
|
|
|
- private static void collectGarbage() {
|
|
|
- try {
|
|
|
- System.gc();
|
|
|
- Thread.sleep(F_SLEEP_INTERVAL);
|
|
|
- System.runFinalization();
|
|
|
- Thread.sleep(F_SLEEP_INTERVAL);
|
|
|
- }
|
|
|
- catch (InterruptedException ex){
|
|
|
- ex.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-}
|