使用 minimax 进行 tic-tac-toe 游戏可以使用多少个线程?

2023-12-29

我们以 5x5 井字游戏为例。 假设轮到我的人工智能了。 然后,

  • 我做了 25 步(基本上每个单元格,当然,如果它是合法的) 移动),
  • 为每次移动创建一个线程(总共 25 个线程(最多)),
  • 在每次移动时调用 minimax 函数,
  • 然后当所有结果都来自每个线程时,
  • 比较得分并选择得分最高的动作。

这是我的问题:

  • 使用25个线程效率高吗?使用 25 个线程意味着什么?

  • 是不是快了 25 倍(很可能不是)?这取决于什么?当然是在计算机上,但是我怎么知道根据计算机的资源可以使用多少个线程呢?

  • 如果我使用太多线程会发生什么(我猜没有......)?

是我的想法good?谢谢。


对于一个典型的受计算限制对于应用程序,一个好的经验法则是使用与硬件核心(或超线程)一样多的线程。使用比内核更多的线程不会使您的应用程序运行得更快。相反,它会导致您的应用程序使用超出所需的内存。每个线程通常有一个 0.5 到 1Mbyte 的堆栈……具体取决于您的硬件和 Java 版本。如果创建太多线程,额外的内存使用将导致性能显着下降;即更多的线程=>更慢的程序!

另一件需要考虑的事情是,在典型的 JVM 上创建 Java 线程的成本很高。因此,除非线程(在其生命周期内)完成了足够的工作,否则您创建线程所花费的时间可能会多于在计算中使用多个核心所获得的时间。

最后,您可能会发现工作并没有均匀地分布在所有线程上,具体取决于您的最小最大算法……以及游戏状态。


如果我尝试实现这一点,我首先将其实现为单线程应用程序,然后:

  • 对它进行基准测试以找出串行运行时计算更多需要多长时间,
  • 分析它以消除任何瓶颈
  • 重新进行基准测试,看看它是否足够快。

当且仅当需要更快时,我才会检查代码并(如果需要)添加一些监视,以了解如何将计算分解为足够大的块以并行执行。

最后,我将使用这些结果来设计和实现多线程版本。

我还会考虑替代方案...例如使用 Java 7 fork/join 而不是线程。


回答您的直接问题:

使用25个线程效率高吗?

可能不会。只有拥有那么多核心才有效(不太可能!)。即使如此,如果通过并行运行事物获得的收益多于因线程相关开销而损失的收益,那么您只能通过使用大量线程获得良好的加速。 (换句话说,这取决于您使用这些线程的效率。)

使用 25 个线程意味着什么?

我假设you意味着您已经创建并启动了 25 个线程,无论是显式的还是使用某些现有的线程池实现。

但最重要的是,如果你有(比如说)4 个核心,那么at most这 25 个线程中的 4 个可以同时执行。其他线程将等待...

是不是快了 25 倍(很可能不是)?这取决于什么?当然是在计算机上,但是我怎么知道根据计算机的资源可以使用多少个线程呢?

限制性能的主要因素是核心数量。往上看。

如果我使用太多线程会发生什么(我猜没有......)?

太多线程意味着您使用更多内存,并且由于内存带宽竞争、物理内存页竞争、额外的垃圾收集,这会使您的应用程序运行速度变慢。这些因素取决于应用程序和平台,并且难以量化;即预测或测量。

根据应用程序的性质(即具体如何实现算法),过多的线程可能会导致额外的锁争用和线程上下文切换。这也会使你的应用程序变慢。

如果不看到实际代码,就不可能预测会发生什么。但核心数量为您提供了可能的加速程度的理论上限。如果您有 4 个核心,那么通过多线程就无法获得超过 4 倍的加速。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 minimax 进行 tic-tac-toe 游戏可以使用多少个线程? 的相关文章

  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • JBoss AS 5 中的共享库应该放在哪里?

    我是 Jboss 新手 但我有多个 Web 应用程序 每个应用程序都使用 spring hibernate 和其他开源库和 portlet 所以基本上现在每个 war 文件都包含这些 jar 文件 如何将这些 jar 移动到一个公共位置 以
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • org.postgresql.util.PSQLException:协议错误。会话设置失败

    我知道这些类型的问题已经存在 但提供的解决方案对我不起作用 在我的应用程序中 没有版本不匹配的黑白驱动程序和 PostgreSQL 服务器 我还没有找到任何其他解决方案 我正在使用 PostgreSQL 服务器 9 4 和 postgres
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 此版本不符合 Google Play 64 位要求,添加库后仍然出现错误

    我正在 Play 商店上传一个视频编辑器应用程序 其中包含带有一些本机代码的库 所以我通过将其添加到 gradle 来使其兼容 64 位 ndk abiFilters armeabi v7a arm64 v8a x86 x86 64 添加了
  • 带有面板的 Java Swing JToolbar:外观和感觉

    我有一个JToolbar其中包含多个JPanels 需要 因为我希望每个都有特定的边界 不幸的是 外观管理器无法识别JPanels属于工具栏和JButtons因此 渲染器与普通按钮一样 即没有工具栏上的特殊鼠标悬停效果 更换JPanels
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • MessageDigest MD5 算法未返回我期望的结果

    我脑后的某个东西告诉我 我在这里遗漏了一些明显的东西 我正在将现有的 java 项目与第三方 api 集成 该第三方 api 使用 api 密钥的 md5 哈希进行身份验证 它对我不起作用 在调试过程中我意识到我生成的哈希值与他们提供的示例
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • Kerberos 缓存票证

    我使用的是 Windows 7 64 位 我创建了一个简单的应用程序来对实现 PrivilegedAction 的类的 run 方法中的文件进行计数 以下是我的 jaas conf 文件 CountFiles com sun securit
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • 无法在 BlackBerry Playbook 上设置音量

    我在更改黑莓游戏书的音量时遇到问题 首先 我将 Android 应用程序重新打包到 Palybook 应用程序 我需要使用搜索栏更改黑莓剧本的音量 并在搜索监听器中设置音频管理器音量 这是代码 audioManager AudioManag
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util

随机推荐

  • 在 Parcel 构建期间在 HTML 文件中调用时,JavaScript 函数不会触发

    我有一个链接到 JavaScript 文件的基本 HTML 表单页面 这两个文件都存在于 Node 项目中 我使用 Parcel 作为捆绑器 因为我最终想将其转换为 TypeScript 当我在浏览器中运行html文件时 JavaScrip
  • 使用类从 ASP.NET 中的数据库填充下拉列表的方法是什么?

    我正在尝试使用如下所示的类从 sql server 填充下拉列表 当将数据绑定到下拉列表时 代码会崩溃 它在向下拉列表提供 dataValueField 和 datatTextField 时出错 HTML a aspx
  • 何时使用记录结构而不是结构,反之亦然?

    我最近发现关于recordC 中的关键字 发现它可以用作record struct如果我理解正确的话 以某种方式使其成为值类型而不是引用类型 但是 我很难理解何时确切使用record struct而不仅仅是struct 据我所见 recor
  • 如何给一个按钮设置多个标签?

    我有 16 个按钮 我对它们进行标记以将一些术语集与按钮配对并从 sqlite 数据库导入 所以 我这样标记它们 labelForButton and tagForButton class MyStruct public MyStruct
  • CodeIgniter 连接两个表

    我正在尝试使用 CodeIgniter 将两个表连接在一起 我使用 CodeIgniter 用户指南寻求帮助 我遇到了一些问题 仅显示一个表的数据 但我不知道为什么 有人可以帮我吗 这是我的代码 控制器 function getall th
  • Flutter:如何永久注册传感器(并且永远不会取消注册?)

    TL DR 如何让 Android 传感器永久运行 活动 注册我的应用程序 即使我关闭它 客观的 我正在制作一个 Flutter 应用程序 使用以下方法来计算您的步数计步器 https pub dev packages pedometer包
  • AWS EC2 Autoscaling:定义一个永不终止的主实例

    我使用具有自动缩放和负载平衡功能的 EC2 来托管我的 Web 应用程序 为了保证EC2实例之间的一致性 我只想允许从一个实例访问管理界面 因此所有写操作都在该实例上执行 然后其他实例定期下载已更改文件的副本 所以这是我的问题 我可以在我的
  • 如果参数等于这个字符串,定义一个像这个字符串的变量

    我正在做一些 bash 脚本 现在我得到了一个变量调用source和一个名为samples 像这样 source country samples US Canada Mexico 因为我想扩大源的数量 并且每个源都有自己的样本 所以我尝试添
  • 在 PHP 中使用 google image API 获取图像搜索结果的第一个 URL

    你知道一个 php 脚本 一个类就很好 可以获取 google api 图像搜索的第一个图像结果的 url 吗 谢谢 Example 正如 Sarfraz 所说 我找到了一种使用简单 HTML DOM 从 Google Image 结果中获
  • X11:通过命令行移动现有窗口?

    给定一个 X 客户端窗口 ID 有没有办法从命令行移动该窗口或更改其几何形状 xlsclients a Window 0x3000001 Machine ohm Name Terminal Icon Name foo Command foo
  • 将 DataGridView 值复制到 TextBox

    我试图得到这个问题的答案 但到目前为止没有任何帮助能够做到我想要的 我有这段代码 它的目的是查看所选行并将其列输出到相应的文本框中 private void DataGridView01 SelectionChanged object se
  • 为 REST-ful API 编写单元测试 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正计划为 RESTful API 编写单元测试 我想知道我应该采取的方法 我最关心的方面与数据库状态有关 我的理解是 每次测试的测试目标的
  • 关于垃圾回收。为什么我们需要调用System.gc();?

    当引用的对象不再可供任何变量使用时 会自动调用垃圾收集 但我想知道为什么当自动调用垃圾回收时我们要显式调用 System gc 我们什么时候调用 System gc 你不知道 正如你所说 垃圾收集是自动的 System gc 甚至不强制进行
  • Ajax - 500 内部服务器错误

    我正在尝试在工作中为这个项目学习AJAX 我有一个加载患者正在服用的药物的网站 我递归地调用此 AJAX 函数 以便它将附加一个包含单一药物和 7 天历史记录的新表 我在 FF 和 IE 中执行代码时遇到问题 在镀铬中工作得非常好 我收到了
  • Python3并行处理opencv视频帧

    我有一个视频文件 需要逐帧处理 然后需要在帧中显示结果 目前我正在按顺序进行处理并一一显示帧 现在我想并行处理帧而不是顺序处理 一旦处理了 X 个帧 则 cv2 imshow 必须出现 并且必须以正确的顺序显示已处理的帧 目前我的顺序代码如
  • 有没有办法在禁用按钮时防止文本变灰?

    当我将按钮设置为禁用时 文本变为灰色 之前为黑色 在我的窗口中 结果是当按钮被禁用时文本不可读 我翻遍了 NSButton NSButtonCell NSCell NSControl 的文档 但没有找到任何方法使文本保持黑色 你知道我该怎么
  • Kotlin编译器会编译java文件吗?

    我有一个包含 java 和 kt 文件的项目 Kotlin 编译器会同时编译 java 和 kt 文件 还是只编译我的 kt 文件 No kotlinc仅编译 Kotlin 文件 kt 混合语言项目需要将两者结合起来kotlinc and
  • Angular + VB.NET - 路由不起作用

    所以我正在开发一个使用 AngularJS 和用 VB NET 编写的 Web API 的项目 所有这些工作都很好 直到我们必须维护路由为止 以下代码来自我的 angularApp 它定义了路由 var angularApp angular
  • 如何在 Cloud Run 上使用 Stackdriver 日志记录

    我正在尝试让 stackdriver 日志记录在 Google Cloud Run 完全托管 中运行的简单 Go 应用程序正常工作 但在 CloudRun 日志中看不到 stackdriver 条目 我已经创建了最简单的演示应用程序 htt
  • 使用 minimax 进行 tic-tac-toe 游戏可以使用多少个线程?

    我们以 5x5 井字游戏为例 假设轮到我的人工智能了 然后 我做了 25 步 基本上每个单元格 当然 如果它是合法的 移动 为每次移动创建一个线程 总共 25 个线程 最多 在每次移动时调用 minimax 函数 然后当所有结果都来自每个线