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 <fangfeng...@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 >