flink-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stephan Ewen <se...@apache.org>
Subject Re: Test about Improve performance of call system.currentTimeMillis()
Date Fri, 14 Aug 2015 17:11:13 GMT
In many cases, we actually need a proper timestamp (for example for
timestamps in streaming records).

I just ran a small micro-benchmark (Java 8, Linux kernel 3.11, 64bit VM)

Making 5,000,000 function calls
System.currentTimeMillis() took: 13240msecs
System.nanoTime() took: 13355msecs

At least on my setup, they seem similar.

Not sure about other setups, though. I am running in a Linux VM, anything
that accesses hardware (like the clock) may be different on bare metal.


On Fri, Aug 14, 2015 at 5:40 PM, Ted Dunning <ted.dunning@gmail.com> wrote:

> A big part of the cost of currentTimeMillis() is that it does a lot of work
> to make sure that the time is really time.
>
> If you only need a monotonic timer, nanoTime() might be what you want
> instead of currentTimeMillis().  nanoTime() is particularly handy when you
> want to avoid issues to do with leap seconds and it is particularly bad
> when you really want the current time.
>
>
> On Fri, Aug 14, 2015 at 2:03 AM, Stephan Ewen <sewen@apache.org> wrote:
>
> > Hi!
> >
> > Nice idea.
> >
> > It would be good to have this implemented as a kind of service that
> > components can "acquire".
> >
> > A component that needs time can do something like "Clock clock =
> > ClockService.aquire()", which increments a reference count in the central
> > clock service and starts the thread if it has not yet been started.
> > When it does not need the clock any more, it can call "clock.release()".
> If
> > the reference count reaches 0, the timer thread is stopped.
> >
> > Additionally, we could use the "finalize()" method as a safety net to
> > release a clock in case the user forgot to release it.
> >
> > Greetings,
> > Stephan
> >
> >
> > On Fri, Aug 14, 2015 at 10:56 AM, Fabian Hueske <fhueske@gmail.com>
> wrote:
> >
> > > Thank you Fengbin Fang for doing this microbenchmark!
> > > The numbers clearly show that your approach is a lot faster.
> > >
> > > I'm curious if this does also affect the performance of a complete data
> > > flow.
> > >
> > > Looking forward to your results,
> > > Fabian
> > >
> > > 2015-08-13 8:35 GMT+02:00 Fangfengbin <fangfengbin@huawei.com>:
> > >
> > > > Hello!
> > > >
> > > > I have a test about cost of System.currentTimeMillis() and my
> > > > CLOCK.currentTimeMillis() .( My clock will be a JVM singleton)
> > > > Call currentTimeMillis function 100000000 times,
> > > > System.currentTimeMillis() need about 1902ms and my
> > > > CLOCK.currentTimeMillis() only need 119ms.
> > > > The function performance is up to about 15 times.
> > > > Next I will use a streaming job to test it.
> > > >
> > > > This is my code:
> > > > #########
> > > > class MillisecondClock {
> > > >     private long rate = 0;
> > > >     private volatile long now = 0;
> > > >
> > > >     private volatile boolean isRunning = true;
> > > >
> > > >     private MillisecondClock(long rate) {
> > > >         this.rate = rate;
> > > >         this.now = System.currentTimeMillis();
> > > >         start();
> > > >     }
> > > >
> > > >     private void start() {
> > > >         new Thread(new Runnable() {
> > > >             @Override
> > > >             public void run() {
> > > >                 while(isRunning)
> > > >                 {
> > > >                     try {
> > > >                         Thread.sleep(rate);
> > > >                     } catch (InterruptedException e) {
> > > >                         e.printStackTrace();
> > > >                     }
> > > >                     now = System.currentTimeMillis();
> > > >                 }
> > > >
> > > >             }
> > > >         }).start();
> > > >     }
> > > >
> > > >     public long currentTimeMillis() {
> > > >         return now;
> > > >     }
> > > >
> > > >     public static final MillisecondClock CLOCK = new
> > MillisecondClock(1);
> > > >
> > > >
> > > >     public static void main(String[] args)
> > > >     {
> > > >         long nowTime = 0;
> > > >
> > > >         //test system currentTimeMillis
> > > >         long startTime = System.currentTimeMillis();
> > > >         long endTime;
> > > >         for(int i = 0;i < 100000000;i++)
> > > >         {
> > > >             nowTime = System.currentTimeMillis();
> > > >         }
> > > >         endTime = System.currentTimeMillis();
> > > >         System.out.println("Time cost: " + (endTime-startTime));
> > > >
> > > >         //test my currentTimeMillis
> > > >         CLOCK.start();
> > > >         startTime = System.currentTimeMillis();
> > > >         for(int i = 0;i < 100000000;i++)
> > > >         {
> > > >             nowTime = CLOCK.currentTimeMillis();
> > > >         }
> > > >         endTime = System.currentTimeMillis();
> > > >         System.out.println("Time cost: " + (endTime-startTime));
> > > >
> > > >     }
> > > > }
> > > > ########
> > > >
> > > > Regards
> > > > Fengbin Fang
> > > >
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message