- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
让我们以 5x5 井字游戏为例。假设轮到我的 AI 了。然后,
这是我的问题:
使用 25 个线程是否高效?使用 25 个线程意味着什么?
它是否快了 25 倍(很可能不是)?它取决于什么?当然是在计算机上,但是我如何根据计算机的资源知道可以使用多少线程呢?
我的想法好吗?谢谢。
最佳答案
对于典型的计算密集型应用程序,一个好的经验法则是使用与硬件核心(或超线程)一样多的线程。使用比核心更多的线程不会使您的应用程序运行得更快。相反,它会导致您的应用程序使用比必要更多的内存。每个线程通常有一个 0.5 到 1MB 的堆栈……取决于您的硬件和 Java 版本。如果你创建了太多线程,额外的内存使用会导致显着的性能损失;即更多线程 => 更慢的程序!
另一件需要考虑的事情是,在典型的 JVM 上创建 Java 线程的成本很高。因此,除非一个线程(在其生命周期内)完成足够的工作,否则您创建线程所花费的时间可能会超过在计算中使用多核所获得的时间。
最后,您可能会发现工作并未均匀分布在所有线程上,具体取决于您的 minmax 算法……和游戏状态。
如果我试图实现它,我会首先将它实现为一个单线程应用程序,然后:
当且仅当它需要更快时,我才会检查代码并(如有必要)添加一些监控以查看如何将计算分解为足够大的 block 以便并行执行。
最后,我将使用这些结果来设计和实现多线程版本。
我还会考虑替代方案......比如使用 Java 7 的 fork/join 而不是线程。
回答您的直接问题:
Is it efficient to use 25 threads?
可能不会。只有当你有那么多核心时它才会有效(不太可能!)。即便如此,如果您通过并行运行事物获得的 yield 多于由于与线程相关的开销而损失的 yield ,那么您只能通过使用大量线程获得良好的加速。 (换句话说,这取决于您如何有效地使用这些线程。)
What does using 25 threads mean?
我假设你的意思是你已经创建并启动了 25 个线程,无论是明确地还是使用一些现有的线程池实现。
但最重要的是,如果您有(比方说)4 个内核,那么这 25 个线程中最多 4 个可以同时执行。其他线程将等待...
Is it 25 times faster (most likely not)? What it depends on? On the computer, of course, but how can I know how many threads are okay to use based on the computer's resources?
限制性能的主要因素是核心数量。见上文。
What happens if I use too many threads (nothing I guess...)?
太多线程意味着您使用更多内存,并且由于内存带宽竞争、物理内存页面竞争、额外的垃圾收集,这会使您的应用程序运行速度变慢。这些因素取决于应用程序和平台,并且难以量化;即预测或测量。
根据您的应用程序的性质(即您实现算法的确切方式),过多的线程可能会导致额外的锁争用和线程上下文切换。这也会使您的应用程序变慢。
如果没有看到您的实际代码,就不可能预测会发生什么。但是核心数量为您提供了可能加速的理论上限。如果您有 4 个内核,那么您无法通过多线程获得超过 4 倍的加速。
关于java - 使用 minimax 的 tic-tac-toe 可以使用多少个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20169547/
我是初学者,所以我的代码很乱。我还没有完整地评论这个游戏,所以如果你需要澄清一些变量,我可以给你。 (顺便说一句,这是一个要求制作井字游戏的c++项目) 我的主要问题是,我将如何重复我的棋盘(每次有人
我正在为C的Tic Tac Toe代码编写一个简单的游戏。我已经完成了大部分代码,但是我希望AI永不丢失。 我已经阅读了有关minimax算法的信息,但我不理解。如何使用此算法使计算机获胜或平局,但永
在MATLAB中,我想对一个别人写的函数进行计时,他们的函数内部可能使用了tic/toc。我想要我自己的 tic/toc。但如果内部函数调用 tic,则外部计时器会重置。 我怎样才能避免这种情况?我不
在MATLAB中,我想对一个别人写的函数进行计时,他们的函数内部可能使用了tic/toc。我想要我自己的 tic/toc。但如果内部函数调用 tic,则外部计时器会重置。 我怎样才能避免这种情况?我不
我现在想用我的代码做两件事。1) 检查获胜者2) 不让双方玩家在同一个位置进入eg.如果player1已经在board[0][0]='X'处输入了value,player2再次进入board[0][0
我在我的 Matlab 项目中的很多地方都使用了 tic-toc 函数。输出时间可以是331.5264 或1234.754 秒 等。我可以输出这种分钟格式吗?例如。 5 分 30.6 秒?谢谢! 最佳
我的代码(或者更确切地说,其他人的代码)有一个奇怪的问题。我正在调试并试图弄清楚为什么我们的时间显示错误。 无论如何,这是打印时间的代码:
我一直在开发一个简单的井字棋游戏,但遇到了一堵砖墙。 虽然大多数游戏功能都已到位,但我缺少适当放置计算机图 block 所需的关键算法。 我需要一种算法,可以搜索 3x3 的瓷砖网格,并在网格中搜索计
我正在用这种格式从数据文件中绘制一个 gnuplot 图表: 01 value_1_1 value_2_1 02 value_1_1 value_2_1 ... 01 value_1_n value_
在 gnuplot 中,如何在 y 轴上的每个 tic 标记处在整个图形上绘制水平条?就像一种特定点在哪里的视觉指示器。 (抱歉,如果这很简单,但谷歌搜索无果而终) 最佳答案 见 set grid命令
感谢这里人们的帮助,我成功地禁用了点击 div 并在已经使用 $(".pos").addClass('already-played'); 选择它们时覆盖它们; 以及 CSS 中的这个: .已经播放{
我正在使用 gnuplot 绘制大量绘图。由于每个图的数据范围(x 轴和 y 轴)都是可变的,因此我需要让 gnuplot 自动设置范围和控制。但是,我需要在绘图下方放置一个定义的网格,水平线各 1/
我有一个井字棋游戏,其中用户(x)玩CPU(o)。游戏开始时,CPU 将 (o) 放置在中心,并在用户之后移动到随机位置。游戏设置为循环,但一旦出现获胜者,它就会重置,并且不会显示“你赢/输的横幅”。
我是 gnuplot 新手,正在尝试为项目创建堆叠直方图。我遇到的问题是,我无法将 ticlabels 放在 x 轴上(即使可以,它们也没有以整齐的方式格式化)。我的gp文件如下: 这是我的数据文件的
我试图在没有人工智能的情况下实现井字棋游戏。不知怎的,我的点击功能会自动触发。您能帮我理解为什么点击功能会自动触发吗?这是 HTML 代码片段。 Tic Tac Toe Gam
我一直在疯狂地寻找这个问题的答案。如何设置 gnuplot 上抽动之间的距离?目前我的情节中的抽搐被挤得太紧了。我希望它们更加分散。 这是一个例子: 我有一个如下所示的图表: 100 ——
我正在制作一个井字游戏程序。我计划将 minimax 与它一起使用。我制作了一棵树,其中包含所有可能的游戏序列的空间,并且我正在寻找一种方法来填充它。我目前有这种类型: typedef struct
我在完成这项学校作业时遇到了问题。我想实现一种方法,其中代码显示 //call method to check for Winner,在每轮后检查获胜者。 我不确定该怎么做。我尝试过各种不同的方法。然
我正在编写一些计算时间很重要的代码。我使用 tic toc 函数和 profiler 来测量时间。它们之间有什么区别? 对于我的一段代码,tic toc 函数说明例如时间是 3 秒,但是我的所有代码行
我正在尝试遵循本教程: https://www.youtube.com/watch?v=Db3cC5iPrOM 2:59 我听不懂他在说什么。 我不明白为什么他在构造函数(public static
我是一名优秀的程序员,十分优秀!