forked from KNEMC/KLALB
优化代码,性能暴涨
This commit is contained in:
@@ -1,21 +1,17 @@
|
||||
package org.kne.cloud.network;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import java.util.function.LongUnaryOperator;
|
||||
import java.util.function.UnaryOperator;
|
||||
|
||||
public class SpeedLimiter {
|
||||
|
||||
public boolean isHitlimit() {
|
||||
return hitlimit;
|
||||
}
|
||||
public SpeedLimiter(long limitspeed, long timedeltans) {
|
||||
super();
|
||||
this.limitspeed = limitspeed;
|
||||
this.timedeltans = timedeltans;
|
||||
}
|
||||
public SpeedLimiter() {
|
||||
super();
|
||||
}
|
||||
private volatile long limitspeed=1024*1024;
|
||||
private volatile long timedeltans=5000000;
|
||||
private long brustTime=1000000L;
|
||||
private volatile boolean hitlimit=false;
|
||||
public long getLimitspeed() {
|
||||
return limitspeed;
|
||||
@@ -25,56 +21,76 @@ public class SpeedLimiter {
|
||||
super();
|
||||
this.limitspeed = limitspeed;
|
||||
}
|
||||
public SpeedLimiter(long limitspeed, long brustTime) {
|
||||
super();
|
||||
this.limitspeed = limitspeed;
|
||||
this.brustTime = brustTime;
|
||||
}
|
||||
|
||||
public void setLimitspeed(long limitspeed) {
|
||||
this.limitspeed = limitspeed;
|
||||
//System.out.println("更新限速:"+limitspeed);
|
||||
}
|
||||
|
||||
public long getTimedeltans() {
|
||||
return timedeltans;
|
||||
public long getBrustTime() {
|
||||
return brustTime;
|
||||
}
|
||||
|
||||
public void setTimedeltans(long timedeltans) {
|
||||
this.timedeltans = timedeltans;
|
||||
public void setBrustTime(long brustTime) {
|
||||
this.brustTime = brustTime;
|
||||
}
|
||||
private long ltime=System.nanoTime();
|
||||
private long counter=0;
|
||||
private AtomicLong ltime=new AtomicLong( System.nanoTime());
|
||||
private AtomicLong waitingtime=new AtomicLong();
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SpeedLimiter [limitspeed=" + limitspeed + "]";
|
||||
}
|
||||
public void forceTransmit(long datasize) {
|
||||
long limitspeedx=limitspeed;
|
||||
if(limitspeedx>0) {
|
||||
long curtime=System.nanoTime();
|
||||
long pasttime=ltime.getAndSet(curtime);
|
||||
long nv=waitingtime.updateAndGet(new LongUnaryOperator() {
|
||||
@Override
|
||||
public long applyAsLong(long t) {
|
||||
t-=curtime-pasttime;
|
||||
if(t<0L)
|
||||
t=0L;
|
||||
return t;
|
||||
}
|
||||
|
||||
});
|
||||
waitingtime.addAndGet(datasize*1000000000L/limitspeedx);
|
||||
}
|
||||
}
|
||||
public boolean checkTransmit(long datasize) {
|
||||
long curtime=System.nanoTime();
|
||||
if(curtime-ltime>timedeltans) {
|
||||
ltime=curtime;
|
||||
if((counter*1000000000)/timedeltans<=limitspeed) {
|
||||
hitlimit=false;
|
||||
}
|
||||
counter=0;
|
||||
}
|
||||
if((counter*1000000000)/timedeltans<=limitspeed) {
|
||||
counter+=datasize;
|
||||
return true;
|
||||
}
|
||||
hitlimit=true;
|
||||
long limitspeedx=limitspeed;
|
||||
if(limitspeedx<=0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
long curtime=System.nanoTime();
|
||||
long pasttime=ltime.getAndSet(curtime);
|
||||
long nv=waitingtime.updateAndGet(new LongUnaryOperator() {
|
||||
@Override
|
||||
public long applyAsLong(long t) {
|
||||
t-=curtime-pasttime;
|
||||
if(t<0L)
|
||||
t=0L;
|
||||
return t;
|
||||
}
|
||||
|
||||
});
|
||||
if(nv<=brustTime) {
|
||||
waitingtime.addAndGet(datasize*1000000000L/limitspeedx);
|
||||
//System.out.println(limitspeed);
|
||||
return true;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public void transmit(long datasize) {
|
||||
while(true) {
|
||||
long curtime=System.nanoTime();
|
||||
if(curtime-ltime>timedeltans) {
|
||||
ltime=curtime;
|
||||
if((counter*1000000000)/timedeltans<=limitspeed) {
|
||||
hitlimit=false;
|
||||
}
|
||||
counter=0;
|
||||
}
|
||||
if((counter*1000000000)/timedeltans<=limitspeed) {
|
||||
counter+=datasize;
|
||||
return;
|
||||
}
|
||||
hitlimit=true;
|
||||
//System.out.println("hit limit");
|
||||
while(!checkTransmit(datasize)) {
|
||||
LockSupport.parkNanos(100000);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user