>I have the log levels for both set at info...

I'd like to point out that that is an unfair test. You're also measuring
how many info or higher statements are in the code. Production
environments won't have the logger set to info as this is a sure way to
degrade performance.

I'd be most interested in the results of these tests with the logger set
to "error" and "fatal", which is what I expect people in production to
do.

Thanks! :)

-Travis Savo

-----Original Message-----
From: Aaron Smuts [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, February 15, 2006 8:27 PM
To: JCS Users List
Subject: Initial performance test results: JCS is almost twice as fast
as EHCache at gets and puts

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]


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

Reply via email to