Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何可靠地每秒调用函数X?

如何可靠地每秒调用函数X?
EN

Stack Overflow用户
提问于 2019-03-03 06:38:22
回答 2查看 239关注 0票数 0

我试图编写一个支持设置tps值的线程库。不过,我有一个问题,就是当租者置其屋计划是15个时,平均时间是66,667毫秒。由于线程只能在完整毫秒内休眠,所以我的解决方案是创建一个查找表,其中所有值加起来都可达1000 ms。

因此,如果我希望每秒钟有15次滴答,我只需在0到14之间做一个for循环,并在表中查找最大睡眠时间。我的问题是如何计算查找表中的值?

我的方法是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int tps = 15;
int[] sleepTime = new int[tps];

float tickTime = 1000.0f / tps;
float increment = 1.0f - (tickTime - (int) tickTime);
float overflow = 0;
int c = 0;
for (int n = 0; n < tps; n++) {
    if (overflow >= 1) overflow = 0;
    sleepTime[n] = (int) tickTime + (int) Math.ceil(overflow);
    c += sleepTime[n];
    overflow += increment;
}

System.out.println(Arrays.toString(sleepTime));
System.out.println("Complete sleep time: " + c);

这对于像15这样的小值很好,但是当我想拥有更高的值(比如31 tps )时,所有计算值的总和都在1000以上(1007对于31)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-03 07:47:29

您可以一步一步地从剩余睡眠时间减去整数除法的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] tps(int tps) {
    int[] sleepTimes = new int[tps];
    for (int i = 0, remainder = 1000; i < tps; i++) {
        int sleepTime = remainder / (tps - i);
        sleepTimes[i] = sleepTime;
        remainder -= sleepTime;
    }
    return sleepTimes;
}

tps(3)的实例评价

  • I= 0,余数= 1000,sleepTime = 333
  • I= 1,余数= 667,sleepTime = 333
  • I= 2,余数= 334,sleepTime = 334
  • I=3(余数= 0,sleepTime = N/A)

要使受影响的值和上限值分布均匀,可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] tps(int tps) {
    int[] sleepTimes = new int[tps];
    int low = 1000 / tps; // the floored value
    Arrays.fill(sleepTimes, low);
    int mod = 1000 % tps; // number of ceiled values to insert
    if (mod > 0) {
        int high = low + 1; // the ceiled value
        float rate = tps / (float) mod; // the insertion rate
        for (int i = 0; i < mod; i++) {
            sleepTimes[Math.round(i * rate)] = high;
        }
    }
    return sleepTimes;
}

tps(21)48,47,4848,47,48E 12248,47,<>E 12448e 225,47,<>E 12648E 227,<>E 12848E 229 47,E 13048E 231>代码> 47,<代码>E 13248EE>E 134<48代码><48代码E 235>代码> 47 >代码>E>E><136<代码<>代码><><>代码><>

票数 1
EN

Stack Overflow用户

发布于 2019-03-03 11:36:52

Thread.sleep(long millis, int nanos)休眠毫秒和纳秒。所以,计算准确的睡眠时间,然后解雇一个工作人员(在另一个线程中)并重新睡眠。这意味着工人的执行时间并不重要。

为了避免漂移错误,根据开始时间和计数器进行睡眠计算。每一个知道,然后线程将睡得少一点,以补偿它自己处理睡眠计时器所需的少量时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54969953

复制
相关文章
X86如何实现函数调用?
的空间保存数据,用户地址空间3G从0x0000000到0xC0000000,内核空间1G从0xC0000000到0xFFFFFFFF。
mingjie
2022/11/30
2.8K0
X86如何实现函数调用?
X86函数调用模型分析
的空间保存数据,地址从0x00000000到0xFFFFFFFF(一个十六进制为对应4个二进制位,所以是2的32次方)。
mingjie
2022/08/03
1.2K0
X86函数调用模型分析
java 如何实现短函数调用?
在Java中,可以使用lambda表达式来实现短函数调用。Lambda表达式是一个匿名函数,它可以传递给方法或存储在变量中,以便在需要时使用。
IT千锋教育
2023/05/24
6510
java 如何实现短函数调用?
如何禁止函数的传值调用
按照参数形式的不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。对于基本数据类型的变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用的效率相差不大。但是,对于类类型来说,传值调用和引用调用之间的区别很大,类对象的尺寸越大,这种差别越大。
恋喵大鲤鱼
2018/08/03
2.8K0
java怎样调用oracle存储函数_oracle如何调用存储过程
之前给大家介绍了java代码调用存储过程,下面要给大家介绍的就是java当中调用oracle存储过程,一起来看看吧。
全栈程序员站长
2022/11/19
2.7K0
java怎样调用oracle存储函数_oracle如何调用存储过程
Linux内核如何替换内核函数并调用原始函数
已经多久没有编程了?很久了吧…其实我本来就不怎么会写代码,时不时的也就是为了验证一个系统特性,写点玩具而已,工程化的代码,对于我而言,实在是吃力。
Linux阅码场
2019/10/08
3.4K0
Linux内核如何替换内核函数并调用原始函数
Nginx如何限制每秒请求次数,限制每秒连接次数,下载速度限制?
Nginx是一款常用的高性能Web服务器和反向代理服务器,其优秀的性能和可扩展性使得它广泛应用于各种网络应用和场景中。在实际使用过程中,为了保障系统的稳定性和安全性,需要对Nginx进行一定的配置和优化。其中,限制每秒请求次数、限制每秒连接次数和下载速度限制等技术是非常重要的配置项之一。
网络技术联盟站
2023/06/08
5.8K0
Nginx如何限制每秒请求次数,限制每秒连接次数,下载速度限制?
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
芋道源码
2019/03/08
1.5K0
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
数据和云01
2019/07/10
1.6K0
GO语言如何调用C写的函数
1.C 文件 #include <stdio.h>   #include <stdlib.h>   extern int sun(int a, int b) {   return a + b;   }   2 GO调用实例 package main   // #include "c_fun.h"   import "C"   import "fmt"   func main() {   fmt.Println("go call c: 3+4=", C.sun(3, 4))   }  
李海彬
2018/03/27
3K0
通过反汇编理解函数调用机制(x86和ARM)
在分析上面的汇编程序之前,需要了解rbp、rsp为栈基址寄存器、栈顶寄存器,分别指向栈底和栈顶;edx、eax、esi、edi均为x86CPU上的通用寄存器,可以存放数据(虽然它们还有别的作用,但是本文章不涉及)
用户7043923
2020/03/12
2K0
如何优化 SQLite 每秒的插入操作
SQLite 的优化比较棘手,就批量插入而言,其速度可以从每秒 85 条优化到每秒 96,000 条。下面我们来具体看下实验过程和结果,
ClearSeve
2022/02/10
3.4K0
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
数据和云
2019/07/15
2.4K0
MySQL 每秒 570000 的写入,如何实现?
浅谈如何定义和调用Python的函数
本文主要介绍了如何定义和调用Python函数。首先介绍了函数的概念和作用,然后详细讲解了如何定义函数和调用函数,最后列举了一个例子来加深理解。
企鹅号小编
2018/01/03
2K0
浅谈如何定义和调用Python的函数
Unity WebGL 程序如何调用Java Script函数
在WebGL的程序中我们可能需要与网页上的其他元素进行通信,或者需要调用一些其他的Web API,本文介绍如何在Unity脚本中调用Java Script函数。
CoderZ
2022/08/29
1.4K0
Unity WebGL 程序如何调用Java Script函数
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
Java团长
2019/03/04
1.3K0
函数调用时栈是如何变化的?
大家都知道函数调用是通过栈来实现的,而且知道在栈中存放着该函数的局部变量。但是对于栈的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数栈是如何实现的。
嵌入式与Linux那些事
2021/12/17
3.6K0
函数调用时栈是如何变化的?
【说站】javascript new如何调用构造函数
以上就是javascript new调用构造函数,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/23
1.2K0
【说站】javascript new如何调用构造函数
点击加载更多

相似问题

如何每秒执行X次函数?

13

每秒调用javascript函数

20

每秒多次调用函数失败

10

如何在HTML中每秒调用javascript函数?

55

用setInterval每秒调用useEffect函数

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文