C++通过JNI回调java的空函数,平均耗时7毫秒,是因为回调过于频繁吗?

时间:2022-04-04 18:16:27
linux下C++ 通过JNI回调java函数,回调函数内容为空,什么都不执行,就是一个函数,但是经常需要有5毫秒--7毫秒的时间,我回调比较频繁,大约每秒150次以上,目标是2000次/秒

是因为CPU较高的原因吗? 6核dell R710的服务器,每核约30%左右。感觉不是很高的。
求帮助。
还有个问题顺便问下,有回答就另外开贴送分。
我使用select IO + 多线程 异步socket 打算实现每秒2000条数据的接收(每条数据1000多个字节),6核CPU较高,是因为select操作频繁导致CPU高吗,换成epoll会不会好一些。

9 个解决方案

#1


回调JAVa,这里有很多JNI的转换消耗等

#2


引用 1 楼 oyljerry 的回复:
回调JAVa,这里有很多JNI的转换消耗等

恩,个人也觉得是这个原因,但是当发送频率较低比如 150次/秒时,回调时间就是0毫秒,而且频率比较高的时候耗时5毫秒以上不是每条都是,出现概率较大。是不是因为java虚拟机这个时候处理不过来的原因呢?

#3


cpu占用高和你选什么模型并没有大的直接关系
你分析下具体消耗在那一步
应该是JAVA虚拟机本身响应消耗了太多资源

#4


引用 3 楼 danscort2000 的回复:
cpu占用高和你选什么模型并没有大的直接关系
你分析下具体消耗在那一步
应该是JAVA虚拟机本身响应消耗了太多资源

恩,已经定位到了,是在这个模型下 socket数太多,开了10个,线程也开的比较多,10个以上,导致很多线程抢占CPU,消耗太大,6核的开了3 -4个CPU,3个socket,就正常了,C++的demo能发到每秒2000条以上。多谢回复,把结论打出来,留作后人参详

#5


顶起来。。。。求回复

#6


顶起来。。。。求回复 

#7


C++通过JNI回调java的空函数,平均耗时7毫秒,是因为回调过于频繁吗?

#8


其实没什么问题的,单线程每秒7000+没问题

#9


后来搞清楚了,都是java的傻逼加了锁,还硬是说没加。

#1


回调JAVa,这里有很多JNI的转换消耗等

#2


引用 1 楼 oyljerry 的回复:
回调JAVa,这里有很多JNI的转换消耗等

恩,个人也觉得是这个原因,但是当发送频率较低比如 150次/秒时,回调时间就是0毫秒,而且频率比较高的时候耗时5毫秒以上不是每条都是,出现概率较大。是不是因为java虚拟机这个时候处理不过来的原因呢?

#3


cpu占用高和你选什么模型并没有大的直接关系
你分析下具体消耗在那一步
应该是JAVA虚拟机本身响应消耗了太多资源

#4


引用 3 楼 danscort2000 的回复:
cpu占用高和你选什么模型并没有大的直接关系
你分析下具体消耗在那一步
应该是JAVA虚拟机本身响应消耗了太多资源

恩,已经定位到了,是在这个模型下 socket数太多,开了10个,线程也开的比较多,10个以上,导致很多线程抢占CPU,消耗太大,6核的开了3 -4个CPU,3个socket,就正常了,C++的demo能发到每秒2000条以上。多谢回复,把结论打出来,留作后人参详

#5


顶起来。。。。求回复

#6


顶起来。。。。求回复 

#7


C++通过JNI回调java的空函数,平均耗时7毫秒,是因为回调过于频繁吗?

#8


其实没什么问题的,单线程每秒7000+没问题

#9


后来搞清楚了,都是java的傻逼加了锁,还硬是说没加。