当前位置:编程学习 > JAVA >>

JAVA如何精确控制速度!大神们请指点~

    最近项目中的性能模块有一个需求就是精确控制报文的发送速度进行系统性能测试,简述下流程,根据指定数量,批量生成报文(每笔报文可以理解成一堆字符串),然后通过消息中间件MQ发给业务系统。但是要求按照一定的速度进行均匀发送,比如一秒钟发送10笔,目前的做法是计算出总笔数在没有延时的情况下发出去的耗时,算出大概速度再反推每笔之间应该加的延时毫秒数,但是发现当延时为几十毫秒的时候通过sleep方式进行延时速度完全不准。
    希望高手指点下,如何实现这种精确的速度控制,注意要达到均匀的效果,比如一秒钟发送10笔,不能是头100毫秒全部发送完后面时间等待这样会造成CPU监控时图形的起伏。大神们都来指点吧!多谢 延时 java 并发 性能 --------------------编程问答-------------------- no way,一般来说java做不到。GC一来统统靠边站。

精准的实时系统不建议用java,至少来说,不建议使用普通的JVM。

可以用特殊设计过的JVM,Azul Zing,它对gc行为的控制更精准,更适合实时要求高的系统。

但是Zing是商业JVM,很贵。 --------------------编程问答-------------------- 我现在有个项目,需求基本跟你这是一样的,我是通过每次循环检测时间差,系统自动调节sleep的时间来做的,结果是并不是非常的均匀,但是从一个时间段来说基本是均匀的。 --------------------编程问答-------------------- NO 做不到 --------------------编程问答-------------------- 这个肯定是可以实现的,不过要自己控制调节算法,好在这个算法在工控领域已经是很成熟的了。

你google一下PID调节:
一、什么叫P、I、D调节?

1、P比例调节:是依据“偏差的大小”来动作,它的输出与输入偏差的大小成比例,比例调节及时有力但有余差。

2、I积分调节:依据“偏差是否存在”来动作,它的输出与偏差对时间的积分成比例,其作用是消除余差。

3、D微分调节:是依据“偏差的变化速度”来动作,它的输出与偏差的变化速度成比例,其效果是阻止被调参数的一切变化,有超前调节作用。

你需要在系统中设置两个线程,一个实时检测运行速度(实际传送的速度),另一个根据实际速度与期望速度之间的差值设置调速参数(intervals)。

与工控领域里的慢吞吞的变化量(温度,速度等等)不同,对于计算机来说这个动作可以做的非常迅速,所以你实际可以做的非常的平滑。 --------------------编程问答-------------------- Java一般不这样做,可以试试C++ --------------------编程问答-------------------- 这位兄台说的动态调节我是有做过的,关键问题就是调速参数如何实现,通过java的sleep延时我们发现在500-1000毫秒的范围内对速度是有明显控制的,但是我们的速度控制从理论上要设置几十毫秒级别的延时,这种情况对速度控制就完全不准了。

引用 4 楼 jinhailong 的回复:
这个肯定是可以实现的,不过要自己控制调节算法,好在这个算法在工控领域已经是很成熟的了。

你google一下PID调节:
一、什么叫P、I、D调节?

1、P比例调节:是依据“偏差的大小”来动作,它的输出与输入偏差的大小成比例,比例调节及时有力但有余差。

2、I积分调节:依据“偏差是否存在”来动作,它的输出与偏差对时间的积分成比例,其作用是消除余差。

3、D微分调节:是依据“偏差的变化速度”来动作,它的输出与偏差的变化速度成比例,其效果是阻止被调参数的一切变化,有超前调节作用。

你需要在系统中设置两个线程,一个实时检测运行速度(实际传送的速度),另一个根据实际速度与期望速度之间的差值设置调速参数(intervals)。

与工控领域里的慢吞吞的变化量(温度,速度等等)不同,对于计算机来说这个动作可以做的非常迅速,所以你实际可以做的非常的平滑。
--------------------编程问答-------------------- Timer的scheduleAtFixedRate不知道行不行 --------------------编程问答-------------------- sleep()中的时间是线程不会运行的最短时间。所以它不能保证到了时间后就能够马上运行。也就是说,在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行。所以会出现你说的,控制在几十毫秒的时候就不准了。
--------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 不行吧,试试别的方法吧 --------------------编程问答-------------------- 明白了,你说的是实时调度的问题,这个恐怕有不少人都有这种需要,你看看其他商业JVM,比如Oracle JRocket什么的。
另外我觉得你可以换一个思路,既然你说的sleep()对速度的控制不好实现,你可以反过来考虑对性能的控制。因为从你的描述,我理解你对消息的时间分布不是特别关心,你关心的是CPU占用的时间分布。如果可以精确控制JVM的运行对CPU的占用,也就达到了你的目的,这个你研究一下看看是不是可行?

引用 6 楼 syp688 的回复:
这位兄台说的动态调节我是有做过的,关键问题就是调速参数如何实现,通过java的sleep延时我们发现在500-1000毫秒的范围内对速度是有明显控制的,但是我们的速度控制从理论上要设置几十毫秒级别的延时,这种情况对速度控制就完全不准了。

Quote: 引用 4 楼 jinhailong 的回复:

这个肯定是可以实现的,不过要自己控制调节算法,好在这个算法在工控领域已经是很成熟的了。

你google一下PID调节:
一、什么叫P、I、D调节?

1、P比例调节:是依据“偏差的大小”来动作,它的输出与输入偏差的大小成比例,比例调节及时有力但有余差。

2、I积分调节:依据“偏差是否存在”来动作,它的输出与偏差对时间的积分成比例,其作用是消除余差。

3、D微分调节:是依据“偏差的变化速度”来动作,它的输出与偏差的变化速度成比例,其效果是阻止被调参数的一切变化,有超前调节作用。

你需要在系统中设置两个线程,一个实时检测运行速度(实际传送的速度),另一个根据实际速度与期望速度之间的差值设置调速参数(intervals)。

与工控领域里的慢吞吞的变化量(温度,速度等等)不同,对于计算机来说这个动作可以做的非常迅速,所以你实际可以做的非常的平滑。
--------------------编程问答-------------------- 同求,一样的问题啊 --------------------编程问答-------------------- 想均匀 的话 使用任务队列就好了。

然后用future,一次执行10个任务,等任务都返回后再执行下10个任务 --------------------编程问答-------------------- --------------------编程问答-------------------- 大神们。。怎么获得积分啊。。。  大三学渣 需要6分积分 下载资源 提交期末考试作业。。。球大神指点。。 --------------------编程问答-------------------- 同求啊   一样的问题 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 俺不会 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 这么高深的问题我还没遇到过 --------------------编程问答-------------------- --------------------编程问答-------------------- java实时性差是出了名的吧。
解释性语言都这样的。
试试c++ c --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答--------------------


Java一般不这样做,可以试试C++.............. --------------------编程问答-------------------- ScheduledThreadPoolExecutor的实时性要比直接用sleep好一些,可以试试 --------------------编程问答-------------------- 表示完全不懂 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 6 楼 syp688 的回复:
这位兄台说的动态调节我是有做过的,关键问题就是调速参数如何实现,通过java的sleep延时我们发现在500-1000毫秒的范围内对速度是有明显控制的,但是我们的速度控制从理论上要设置几十毫秒级别的延时,这种情况对速度控制就完全不准了。

Quote: 引用 4 楼 jinhailong 的回复:

这个肯定是可以实现的,不过要自己控制调节算法,好在这个算法在工控领域已经是很成熟的了。

你google一下PID调节:
一、什么叫P、I、D调节?

1、P比例调节:是依据“偏差的大小”来动作,它的输出与输入偏差的大小成比例,比例调节及时有力但有余差。

2、I积分调节:依据“偏差是否存在”来动作,它的输出与偏差对时间的积分成比例,其作用是消除余差。

3、D微分调节:是依据“偏差的变化速度”来动作,它的输出与偏差的变化速度成比例,其效果是阻止被调参数的一切变化,有超前调节作用。

你需要在系统中设置两个线程,一个实时检测运行速度(实际传送的速度),另一个根据实际速度与期望速度之间的差值设置调速参数(intervals)。

与工控领域里的慢吞吞的变化量(温度,速度等等)不同,对于计算机来说这个动作可以做的非常迅速,所以你实际可以做的非常的平滑。


10 毫秒级别的实时控制系统用java,这好比是用叉子喝汤。
Zing也做不到,通常Zing能在长期运行把GC,STW控制到50毫秒内。

你们的构架师可以去跳楼了,太外行了,明显是C的活。
--------------------编程问答-------------------- 完全不懂打酱油路过 --------------------编程问答-------------------- 建议你学习一下,工业控制网是如何精准时间周期控制的。主要以下几条:
1、专用控制器内置单任务系统。保证周期恒定。
2、通讯网络,严格限定使用者,固定报文格式。
3、网络接口板独立专用。
4、网络使用现场总线。

你用win和linux 那就别指望精准了。起码要中间有控制转换器。 --------------------编程问答-------------------- 我觉得把SQL语句写好,性能自然就上来了.你说对么 --------------------编程问答--------------------
引用 17 楼 u012983338 的回复:
大神们。。怎么获得积分啊。。。  大三学渣 需要6分积分 下载资源 提交期末考试作业。。。球大神指点。。


http://bbs.csdn.net/topics/390516692 --------------------编程问答-------------------- 通用计算机不是干这个的,这个需求需要电子级的实现,即板卡级编程。需要专用的板卡。你可以向你的老板汇报了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 楼上讲的有道理,根本问题就是,这种场景不该使用通用计算机和通用操作系统。
需要专用设备。 --------------------编程问答-------------------- buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会buhui不会 --------------------编程问答-------------------- 将报文匀速给MQ队列,沒必要。匀速给MQ的目的是什么?如担心消息拥堵,发送前检查队列是剩余消息数决定是否发送。 --------------------编程问答-------------------- 进来学习 --------------------编程问答-------------------- 不熟悉java,用c++吧
--------------------编程问答-------------------- 这个东西我觉得不可能用java实现,C/C++中的sleep都是有误差的,我记得在CSDN上的某个博客看到过 --------------------编程问答-------------------- Java 是不适合做这类任务的,我也觉得你应该试一试C/C++。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 打个酱油 --------------------编程问答-------------------- Java也有实时技术,看一下也许有帮助
http://www.ibm.com/developerworks/cn/java/j-rtj/ --------------------编程问答--------------------
用心顶一下 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 49 楼 xxxxxxxx86 的回复:
Java也有实时技术,看一下也许有帮助
http://www.ibm.com/developerworks/cn/java/j-rtj/


不错,但是好贵。

需要使用他家定制的Linux,单CPU一年license最便宜也要7000刀。

据说USA 海军的DDS滨海战斗舰上使用的是WebSphere RT。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,