优化代码,性能暴涨

This commit is contained in:
Administrator
2025-01-29 14:01:11 +08:00
parent e243203535
commit 6de65562be
130 changed files with 9138 additions and 1020 deletions
+59 -43
View File
@@ -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);
}
}