I just built both EHCache and JCS from head,
configured both similarly and ran multiple put / get
rounds of 50,000.  JCS, using the default LRU Memory
Cache, was nearly twice as fast as EHCache in multiple
trials for both puts and gets.  I have the log levels
for both set at info.  I would like to verify my
results, since they completely contradict the
information on the EHCache site.  From what I can tell
so far, JCS is significantly faster than EHCache.  

Since, neither will be a relevant bottleneck, it may
be beside the point. . . .  I will run more tests to
confirm.

Here is the data:

JCS       put time for 50000 = 651; millis per =
0.01302
JCS       get time for 50000 = 160; millis per =
0.0032
EHCache   put time for 50000 = 481; millis per =
0.00962
EHCache   get time for 50000 = 110; millis per =
0.0022


JCS       put time for 50000 = 240; millis per =
0.0048
JCS       get time for 50000 = 90; millis per = 0.0018
EHCache   put time for 50000 = 491; millis per =
0.00982
EHCache   get time for 50000 = 120; millis per =
0.0024


JCS       put time for 50000 = 241; millis per =
0.00482
JCS       get time for 50000 = 80; millis per = 0.0016
EHCache   put time for 50000 = 551; millis per =
0.01102
EHCache   get time for 50000 = 110; millis per =
0.0022


JCS       put time for 50000 = 240; millis per =
0.0048
JCS       get time for 50000 = 90; millis per = 0.0018
EHCache   put time for 50000 = 481; millis per =
0.00962
EHCache   get time for 50000 = 130; millis per =
0.0026


JCS       put time for 50000 = 230; millis per =
0.0046
JCS       get time for 50000 = 181; millis per =
0.00362
EHCache   put time for 50000 = 520; millis per =
0.0104
EHCache   get time for 50000 = 101; millis per =
0.00202


JCS       put time for 50000 = 220; millis per =
0.0044
JCS       get time for 50000 = 90; millis per = 0.0018
EHCache   put time for 50000 = 641; millis per =
0.01282
EHCache   get time for 50000 = 110; millis per =
0.0022


JCS       put time for 50000 = 250; millis per =
0.0050
JCS       get time for 50000 = 121; millis per =
0.00242
EHCache   put time for 50000 = 590; millis per =
0.0118
EHCache   get time for 50000 = 101; millis per =
0.00202


JCS       put time for 50000 = 260; millis per =
0.0052
JCS       get time for 50000 = 100; millis per =
0.0020
EHCache   put time for 50000 = 581; millis per =
0.01162
EHCache   get time for 50000 = 100; millis per =
0.0020


JCS       put time for 50000 = 290; millis per =
0.0058
JCS       get time for 50000 = 121; millis per =
0.00242
EHCache   put time for 50000 = 570; millis per =
0.0114
EHCache   get time for 50000 = 121; millis per =
0.00242


JCS       put time for 50000 = 210; millis per =
0.0042
JCS       get time for 50000 = 120; millis per =
0.0024
EHCache   put time for 50000 = 561; millis per =
0.01122
EHCache   get time for 50000 = 130; millis per =
0.0026


JCS       put time for 50000 = 250; millis per =
0.0050
JCS       get time for 50000 = 151; millis per =
0.00302
EHCache   put time for 50000 = 560; millis per =
0.0112
EHCache   get time for 50000 = 111; millis per =
0.00222


JCS       put time for 50000 = 250; millis per =
0.0050
JCS       get time for 50000 = 100; millis per =
0.0020
EHCache   put time for 50000 = 711; millis per =
0.01422
EHCache   get time for 50000 = 100; millis per =
0.0020


JCS       put time for 50000 = 251; millis per =
0.00502
JCS       get time for 50000 = 90; millis per = 0.0018
EHCache   put time for 50000 = 511; millis per =
0.01022
EHCache   get time for 50000 = 90; millis per = 0.0018


JCS       put time for 50000 = 220; millis per =
0.0044
JCS       get time for 50000 = 100; millis per =
0.0020
EHCache   put time for 50000 = 491; millis per =
0.00982
EHCache   get time for 50000 = 90; millis per = 0.0018


JCS       put time for 50000 = 230; millis per =
0.0046
JCS       get time for 50000 = 80; millis per = 0.0016
EHCache   put time for 50000 = 201; millis per =
0.00402
EHCache   get time for 50000 = 390; millis per =
0.0078


JCS       put time for 50000 = 201; millis per =
0.00402
JCS       get time for 50000 = 120; millis per =
0.0024
EHCache   put time for 50000 = 180; millis per =
0.0036
EHCache   get time for 50000 = 411; millis per =
0.00822


JCS       put time for 50000 = 210; millis per =
0.0042
JCS       get time for 50000 = 100; millis per =
0.0020
EHCache   put time for 50000 = 210; millis per =
0.0042
EHCache   get time for 50000 = 381; millis per =
0.00762


JCS       put time for 50000 = 240; millis per =
0.0048
JCS       get time for 50000 = 90; millis per = 0.0018
EHCache   put time for 50000 = 211; millis per =
0.00422
EHCache   get time for 50000 = 410; millis per =
0.0082


JCS       put time for 50000 = 221; millis per =
0.00442
JCS       get time for 50000 = 80; millis per = 0.0016
EHCache   put time for 50000 = 210; millis per =
0.0042
EHCache   get time for 50000 = 411; millis per =
0.00822


JCS       put time for 50000 = 220; millis per =
0.0044
JCS       get time for 50000 = 80; millis per = 0.0016
EHCache   put time for 50000 = 190; millis per =
0.0038
EHCache   get time for 50000 = 411; millis per =
0.00822


Finished 20 loops of 50000 gets and puts


Put average for JCS        = 256
Put average for EHCache   = 447
JCS       puts took 0.57270694 times the EHCache  ,
the goal is <1.0x


Get average for  JCS        = 107
Get average for EHCache   = 196
JCS       gets took 0.54591835 times the EHCache  ,
the goal is <1.0x


Here is the test class:



package org.apache.jcs;

import junit.framework.TestCase;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jcs.engine.CompositeCacheAttributes;
import
org.apache.jcs.engine.behavior.ICompositeCacheAttributes;
import org.apache.jcs.utils.struct.LRUMap;

/**
 * Compare JCS vs ehcache performance.
 * 
 * @author Aaron Smuts
 * 
 */
public class JCSvsEHCachePerformanceTest
    extends TestCase
{

    float ratioPut = 0;

    float ratioGet = 0;

    // the jcs to competitor
    float target = 1.0f;

    int loops = 20;

    int tries = 50000;

    /**
     * Compare performance between JCS and EHCache.
Fail if JCS is not as fast.
     * Print the ratio.
     * 
     * @throws Exception
     * 
     */
    public void testJCSvsEHCache()
        throws Exception
    {

        Log log = LogFactory.getLog( LRUMap.class );
        if ( log.isDebugEnabled() )
        {
            System.out.println( "The log level must be
at info or above for the a performance test." );
            return;
        }

        doWork();
        
        assertTrue( this.ratioPut < target );
        assertTrue( this.ratioGet < target );

    }

    /**
     * This runs a series of gets and puts for both
JCS and EHCache. The test
     * will fail if JCS is not faster.
     * 
     * @throws Exception
     * 
     */
    public void doWork()
        throws Exception
    {

        int maxSize = 1000000;

        // create the two caches.
        CacheManager ehMgr =
CacheManager.getInstance();
        // Create an ehcache with a max size of
maxSize, no swap, with items
        // that can expire, with maximum idle time to
live of 500 seconds, and
        // maximum idel time of 500 seconds.
        Cache eh = new Cache( "testJCSvsEHCache",
maxSize, false, false, 500, 500 );
        ehMgr.addCache( eh );

        // Create a similarly configured JCS that uses
the LRU memory cache.
        // maxSize elements that are not eternal. No
disk cache is configured.
        ICompositeCacheAttributes cattr = new
CompositeCacheAttributes();
        cattr.setMaxObjects( maxSize );
        JCS jcs = JCS.getInstance( "testJCSvsEHCache"
);

        // run settings
        long start = 0;
        long end = 0;
        long time = 0;
        float tPer = 0;

        long putTotalJCS = 0;
        long getTotalJCS = 0;
        long putTotalEHCache = 0;
        long getTotalEHCache = 0;

        String jcsDisplayName = "JCS";
        String ehCacheDisplayName = "";

        try
        {
            for ( int j = 0; j < loops; j++ )
            {

                jcsDisplayName = "JCS      ";
                start = System.currentTimeMillis();
                for ( int i = 0; i < tries; i++ )
                {
                    jcs.put( "key:" + i, "data" + i );
                }
                end = System.currentTimeMillis();
                time = end - start;
                putTotalJCS += time;
                tPer = Float.intBitsToFloat( (int)
time ) / Float.intBitsToFloat( tries );
                System.out
                    .println( jcsDisplayName + " put
time for " + tries + " = " + time + "; millis per = "
+ tPer );

                start = System.currentTimeMillis();
                for ( int i = 0; i < tries; i++ )
                {
                    jcs.get( "key:" + i );
                }
                end = System.currentTimeMillis();
                time = end - start;
                getTotalJCS += time;
                tPer = Float.intBitsToFloat( (int)
time ) / Float.intBitsToFloat( tries );
                System.out
                    .println( jcsDisplayName + " get
time for " + tries + " = " + time + "; millis per = "
+ tPer );

                //
/////////////////////////////////////////////////////////////
                ehCacheDisplayName = "EHCache  ";

                start = System.currentTimeMillis();
                for ( int i = 0; i < tries; i++ )
                {
                    Element ehElm = new Element(
"key:" + i, "data" + i );

                    eh.put( ehElm );
                }
                end = System.currentTimeMillis();
                time = end - start;
                putTotalEHCache += time;
                tPer = Float.intBitsToFloat( (int)
time ) / Float.intBitsToFloat( tries );
                System.out.println( ehCacheDisplayName
+ " put time for " + tries + " = " + time + "; millis
per = "
                    + tPer );

                start = System.currentTimeMillis();
                for ( int i = 0; i < tries; i++ )
                {
                    eh.get( "key:" + i );
                }
                end = System.currentTimeMillis();
                time = end - start;
                getTotalEHCache += time;
                tPer = Float.intBitsToFloat( (int)
time ) / Float.intBitsToFloat( tries );
                System.out.println( ehCacheDisplayName
+ " get time for " + tries + " = " + time + "; millis
per = "
                    + tPer );

                System.out.println( "\n" );
            }

        }
        catch ( Exception e )
        {
            e.printStackTrace( System.out );
            System.out.println( e );
        }

        long putAvJCS = putTotalJCS / loops;
        long getAvJCS = getTotalJCS / loops;
        long putAvHashtable = putTotalEHCache / loops;
        long getAvHashtable = getTotalEHCache / loops;

        System.out.println( "Finished " + loops + "
loops of " + tries + " gets and puts" );

        System.out.println( "\n" );
        System.out.println( "Put average for " +
jcsDisplayName + "  = " + putAvJCS );
        System.out.println( "Put average for " +
ehCacheDisplayName + " = " + putAvHashtable );
        ratioPut = Float.intBitsToFloat( (int)
putAvJCS ) / Float.intBitsToFloat( (int)
putAvHashtable );
        System.out.println( jcsDisplayName + " puts
took " + ratioPut + " times the " + ehCacheDisplayName
            + ", the goal is <" + target + "x" );

        System.out.println( "\n" );
        System.out.println( "Get average for  " +
jcsDisplayName + "  = " + getAvJCS );
        System.out.println( "Get average for " +
ehCacheDisplayName + " = " + getAvHashtable );
        ratioGet = Float.intBitsToFloat( (int)
getAvJCS ) / Float.intBitsToFloat( (int)
getAvHashtable );
        System.out.println( jcsDisplayName + " gets
took " + ratioGet + " times the " + ehCacheDisplayName
            + ", the goal is <" + target + "x" );

    }

}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to