滑动窗口计数器:Copilot 拿我本机的代码推荐给我

这篇具有很好参考价值的文章主要介绍了滑动窗口计数器:Copilot 拿我本机的代码推荐给我。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

随着机器学习技术的不断发展,人工智能已经开始渗透到各个领域。其中,最引人注目的之一便是 AI 辅助编程工具。在这个领域里,Github Copilot 无疑是一颗闪耀的明星,它可以推荐代码片段、自动生成代码,并提供代码补全和建议等功能。Github Copilot 以插件的方式集成到IDA中,如果你的IDE找不到或无法安装这个插件,请升级软件版本。

目录

自己以前写的代码片段

Copilot 推荐的代码片段

完整代码


前年为应对项目中调用的一个接口限流问题,简单写了一个单机版的滑动窗口计数器。今天想让 Copilot 写一个,输入类名称后,它向我推荐的代码片段,竟然我和之前编写的一模一样。以下分别是以前写的代码片段(完整代码在文末),和 Copilot 推荐的代码片段。

自己以前写的代码片段

滑动窗口计数器:Copilot 拿我本机的代码推荐给我,Java,copilot,java

Copilot 推荐的代码片段

滑动窗口计数器:Copilot 拿我本机的代码推荐给我,Java,copilot,java

更有趣的是,Copilot 可以不断地学习和改进。细心的读者可能已经发现,前面两幅图中的代码有一点差异,是因为我对自己的代码进行了优化,去掉了第27行的 if。Copilot 也注意到了这一点,并更新自己的模型数据,不久后当我让 Copilot 重新推荐这个代码,并且即使我对自己的代码撤销了该优化,Copilot 仍向我推荐优化后的代码。

最后的main()方法,Copilot 没参考我以前的代码,只根据上下文生成,相比我自己写的要简单些。文章来源地址https://www.toymoban.com/news/detail-526156.html

完整代码

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 滑动窗口计数器
 */
public class SlidingWindow {
    //滑动窗口元素数组
    private final WindowElement[] windowElements;
    //窗口长度
    private final int windowSize;
    //窗口期
    private final long windowDuration;
    //窗口精度
    private final long windowAccuracy;
    //时间戳
    private long ctm;

    //滑动窗口元素
    private class WindowElement {
        public AtomicLong num = new AtomicLong(0);
        public long ts = 0;
        public long incrAndGet() {
            synchronized (this) {
                if (ts < ctm - windowDuration) {
                    num.set(1);
                    ts = ctm;
                    return 1;
                }
            }
            return num.incrementAndGet();
        }
    }

    /**
     * 创建一个滑动窗口计数器
     * @param duration
     * @param accuracy
     */
    public SlidingWindow(Duration duration, Duration accuracy) {
        windowDuration = duration.toMillis();
        windowAccuracy = accuracy.toMillis();
        //窗口长度+1,确保窗口元素过期才会被覆盖
        windowSize = (int) Math.ceil(1.0 * duration.toMillis() / accuracy.toMillis()) + 1;
        windowElements = new WindowElement[windowSize];
        for (int i = 0; i < windowSize; i++) {
            windowElements[i] = new WindowElement();
        }
    }

    /**
     * 计数+1
     * @return
     */
    public long increment() {
        ctm = System.currentTimeMillis();
        int index = (int) ((ctm / windowAccuracy) % windowSize);
        return windowElements[index].incrAndGet();
    }

    /**
     * 计数+1并返回计数总和
     * @return
     */
    public long incrementAndGet() {
        long sum = increment();
        if (windowSize == 1) {
            return sum;
        } else {
            return Arrays.stream(windowElements).filter(e -> e.ts >= ctm - windowDuration).mapToLong(e -> e.num.get()).sum();
        }
    }

    /**
     * 返回窗口中所有计数总和
     * @return
     */
    public long getSum() {
        ctm = System.currentTimeMillis();
        return Arrays.stream(windowElements).filter(e -> e.ts >= ctm - windowDuration).mapToLong(e -> e.num.get()).sum();
    }

    public static void main(String[] args) {
        SlidingWindow window = new SlidingWindow(Duration.ofMillis(500), Duration.ofMillis(100));
        Random rand = new Random(System.currentTimeMillis());

        //创建一个线程,每50ms执行一次,输出当前窗口计数总和
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println(LocalDateTime.now() + " sum: " + window.getSum());
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    break;
                }
            }
        });
        thread.start();

        //创建5个线程,每个线程随机休眠0~100ms,随机执行+1操作
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
        for (int t = 0; t < 5; t++) {
            executor.execute(() -> {
                String threadName = Thread.currentThread().getName();
                for (int i = 0; i < 50; i++) {
                    String out = LocalDateTime.now() + " [" + threadName + "]";
                    if (rand.nextBoolean()) {
                        window.increment();
                        System.out.println(out + " +1");
                    }
                    try {
                        Thread.sleep(rand.nextInt(100));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        //关闭线程池
        executor.shutdown();
        //等待线程池中所有线程执行完毕
        try {
            executor.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //通知线程thread退出
        thread.interrupt();
    }

}

到了这里,关于滑动窗口计数器:Copilot 拿我本机的代码推荐给我的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA拾忆_(3):调用IP 计数器&BCD计数器

    调用IP计数器: 每来一个cin(进位输入)信号,计数器输出值加一,当计数值为9且cin为1时,输出一个时钟长度的cout(进位输出)信号。 首先采用调用quartus种IP的方式,具体步骤: Tools----IP Catalog: 然后会调出IP目录窗口: 通过搜索counter来添加计数器模块,需要设置的内容

    2024年02月03日
    浏览(55)
  • verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

    2023.5.12 编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号 zero ,当置位信号 set 有效时,将当前输出置为输入的数值 set_num 。 注意 :这里zero=1和num=0是同一拍输出的,按道理如果根据num=0,然后去输出zero=1应该延迟一拍。所以这里考虑将number延迟一

    2024年02月07日
    浏览(52)
  • LR中监控ORACLE数据库常用计数器(如何自定义Oracle计数器)

    目录 一、添加自定义计数器的方法 1、要创建自定义查询,请执行以下操作: 2、配置文件示例对象 二、常用自定义计数器列表 三、LR中监控ORACLE数据库常用计数器遇到问题及处理 1. 在安装路径的Mercury LoadRunnerdatmonitors找到vmon.cfg文件,打开。 2. 在vmon.cfg文件的第三行中,

    2024年02月15日
    浏览(51)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(57)
  • 用74LS73设计四位二进制加法计数器和8421BCD加法计数器

     (1)用2片74LS73实现该电路,由CP端输入单脉冲,设计并画出4位异步二进制加法计数器电路图。  (2)由CP端输入单脉冲,测试并记录Q1~Q4端状态及波形。 四位二进制加法计数器状态迁移表如下: Q 4n Q 3n Q 2n Q 1n Q 4n+1 Q 3n+1 Q 2n+1 Q 1n+1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0

    2024年02月10日
    浏览(85)
  • 定时器/计数器中定时/计数初值的计算

             寄存器TMOD是单片机的一个特殊功能寄存器,其功能是控制定时器/计数器T0、T1的工作方式。它的字节地址为89H, 不可以对它进行位操作。          只能进行字节操作, 即给寄存器整体赋值的方法 设置初始值 ,如 TMOD=0x01 。在上电和复位时,寄存器TMOD的初始

    2024年02月10日
    浏览(47)
  • 数电:计数器

    同步计数器和异步计数器的区别 1.同步计数器的外部时钟端都连在一起,而异步计数器没有 2.同步计数器在外部信号到来时触发器同时翻转,而异步计数器的触发器为串行连接,工作频率较低 3.异步计数器输出状态的建立,要比CP慢一个传输时间,容易存在竞争冒险 竞争冒险

    2024年02月06日
    浏览(45)
  • Linux性能计数器

      性能计数器是在大多数现代cpu上可用的特殊硬件寄存器。这些寄存器统计特定类型的hw事件的数量:例如执行的指令、遭受的cachemisses或错误预测的分支,而不会减慢内核或应用程序的速度。这些寄存器还可以在事件数量达到阈值时触发中断——因此可以用于分析在该CP

    2024年02月11日
    浏览(64)
  • verilog计数器

    (1) 深入了解计数器原理 (2) 学习使用 Verilog 实现同步计数器 ( 模八) 计数器的功能是记忆脉冲个数,它是数字系统中应用最为广泛的时序逻辑构件。 下图为设计 计数器从0开始每隔25_000_000个时钟周期(0.25秒)数码管末位显示加一,最大值为7,7后复0值              这

    2024年02月05日
    浏览(61)
  • 【时序逻辑电路】——计数器

    🦄🦄欢迎大家来学习数字电路——时序逻辑电路。 🦄🦄在这里我们会讲解二进制计数器、十进制计数器和集成计数器74LS161,希望通过我们的学习会让你更明白数字电路中的奥秘。 目录 🔑一、计数器  🏆1.二进制计数器  (1)异步二进制加法计数器 (2)同步二进制加法

    2024年02月02日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包