当前位置:   article > 正文

滑动窗口计数器:Copilot 拿我本机的代码推荐给我_copilot 代码片段分享

copilot 代码片段分享

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

目录

自己以前写的代码片段

Copilot 推荐的代码片段

完整代码


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

自己以前写的代码片段

Copilot 推荐的代码片段

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

最后的main()方法,Copilot 没参考我以前的代码,只根据上下文生成,相比我自己写的要简单些。

完整代码

  1. import java.time.Duration;
  2. import java.time.LocalDateTime;
  3. import java.util.Arrays;
  4. import java.util.Random;
  5. import java.util.concurrent.LinkedBlockingQueue;
  6. import java.util.concurrent.ThreadPoolExecutor;
  7. import java.util.concurrent.TimeUnit;
  8. import java.util.concurrent.atomic.AtomicLong;
  9. /**
  10. * 滑动窗口计数器
  11. */
  12. public class SlidingWindow {
  13. //滑动窗口元素数组
  14. private final WindowElement[] windowElements;
  15. //窗口长度
  16. private final int windowSize;
  17. //窗口期
  18. private final long windowDuration;
  19. //窗口精度
  20. private final long windowAccuracy;
  21. //时间戳
  22. private long ctm;
  23. //滑动窗口元素
  24. private class WindowElement {
  25. public AtomicLong num = new AtomicLong(0);
  26. public long ts = 0;
  27. public long incrAndGet() {
  28. synchronized (this) {
  29. if (ts < ctm - windowDuration) {
  30. num.set(1);
  31. ts = ctm;
  32. return 1;
  33. }
  34. }
  35. return num.incrementAndGet();
  36. }
  37. }
  38. /**
  39. * 创建一个滑动窗口计数器
  40. * @param duration
  41. * @param accuracy
  42. */
  43. public SlidingWindow(Duration duration, Duration accuracy) {
  44. windowDuration = duration.toMillis();
  45. windowAccuracy = accuracy.toMillis();
  46. //窗口长度+1,确保窗口元素过期才会被覆盖
  47. windowSize = (int) Math.ceil(1.0 * duration.toMillis() / accuracy.toMillis()) + 1;
  48. windowElements = new WindowElement[windowSize];
  49. for (int i = 0; i < windowSize; i++) {
  50. windowElements[i] = new WindowElement();
  51. }
  52. }
  53. /**
  54. * 计数+1
  55. * @return
  56. */
  57. public long increment() {
  58. ctm = System.currentTimeMillis();
  59. int index = (int) ((ctm / windowAccuracy) % windowSize);
  60. return windowElements[index].incrAndGet();
  61. }
  62. /**
  63. * 计数+1并返回计数总和
  64. * @return
  65. */
  66. public long incrementAndGet() {
  67. long sum = increment();
  68. if (windowSize == 1) {
  69. return sum;
  70. } else {
  71. return Arrays.stream(windowElements).filter(e -> e.ts >= ctm - windowDuration).mapToLong(e -> e.num.get()).sum();
  72. }
  73. }
  74. /**
  75. * 返回窗口中所有计数总和
  76. * @return
  77. */
  78. public long getSum() {
  79. ctm = System.currentTimeMillis();
  80. return Arrays.stream(windowElements).filter(e -> e.ts >= ctm - windowDuration).mapToLong(e -> e.num.get()).sum();
  81. }
  82. public static void main(String[] args) {
  83. SlidingWindow window = new SlidingWindow(Duration.ofMillis(500), Duration.ofMillis(100));
  84. Random rand = new Random(System.currentTimeMillis());
  85. //创建一个线程,每50ms执行一次,输出当前窗口计数总和
  86. Thread thread = new Thread(() -> {
  87. while (true) {
  88. System.out.println(LocalDateTime.now() + " sum: " + window.getSum());
  89. try {
  90. Thread.sleep(50);
  91. } catch (InterruptedException e) {
  92. break;
  93. }
  94. }
  95. });
  96. thread.start();
  97. //创建5个线程,每个线程随机休眠0~100ms,随机执行+1操作
  98. ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
  99. for (int t = 0; t < 5; t++) {
  100. executor.execute(() -> {
  101. String threadName = Thread.currentThread().getName();
  102. for (int i = 0; i < 50; i++) {
  103. String out = LocalDateTime.now() + " [" + threadName + "]";
  104. if (rand.nextBoolean()) {
  105. window.increment();
  106. System.out.println(out + " +1");
  107. }
  108. try {
  109. Thread.sleep(rand.nextInt(100));
  110. } catch (InterruptedException e) {
  111. e.printStackTrace();
  112. }
  113. }
  114. });
  115. }
  116. //关闭线程池
  117. executor.shutdown();
  118. //等待线程池中所有线程执行完毕
  119. try {
  120. executor.awaitTermination(1, TimeUnit.MINUTES);
  121. } catch (InterruptedException e) {
  122. e.printStackTrace();
  123. }
  124. //通知线程thread退出
  125. thread.interrupt();
  126. }
  127. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/274696
推荐阅读
相关标签
  

闽ICP备14008679号