multithreading - 处理器速度如何跨线程分布?

标签 multithreading web-applications benchmarking

目标:
我试图估计我的代码在多个线程中并发运行时的执行速度。

问题 1)

如果我确切地知道我的代码在一个线程中为单个请求运行的速度有多快,他们有什么方法可以估计它在多个线程中运行的速度吗?

问题 2)

如果有的话,其他线程的存在对其他线程的执行速度有什么影响?

我的情况:

我遍历内存中最坏情况下大小为 100 万个节点的图。它只是一次访问 100 万个内存地址 1。在 1 个线程上需要半秒,我担心这将如何随着多个用户执行相同的查询而扩展。每个用户请求都由一个单独的线程处理,因此 100 个并发用户将需要 100 个并发线程。每个线程共享相同的资源但只读。没有写作。有没有可能让每个用户看到大致相同的执行时间?

注:我知道这将取决于许多因素,但如果您发现它需要 ,肯定必须有某种方法来确定您的代码是否可以扩展。 x 给定单个线程的时间量 x 硬件。最后,我想补充一点,我对计算机硬件架构以及多线程如何在幕后工作的经验有限。

最佳答案

这些都是有趣的问题,但不幸的是,没有直接的答案,因为答案将取决于许多不同的因素。

大多数现代机器都是多核的:在理想情况下,四线程进程能够在四核机器中几乎线性地扩展(即运行速度提高四倍)。

然而,大多数程序大部分时间都在等待事物:磁盘或数据库访问、内存总线、网络 I/O、用户输入和其他资源。更快的机器通常不会使这些事情明显更快。

大多数现代操作系统(包括 Windows、Unix/Linux 和 MacOS)使用处理器的方式是通过或多或少的循环方式将处理器时间安排到进程和线程:在任何给定时间都可能有线程正在等待处理器时间(这有点简单,因为它们都有一些进程优先级的概念,因此高关键进程比不太重要的进程更早地被插入队列)。

当一个线程使用一个处理器内核时,只要它的时间片持续,它就会得到所有的东西:实际上,一次只有一件事实际上在单个内核上运行。当进程用完它的时间片,或者请求一些不是立即可用的资源时,它在处理器核心的轮次结束,下一个计划任务将开始。这往往可以很好地利用处理器资源。

那么,决定流程规模化程度的因素有哪些?

  • 单个进程花费在其运行时间的哪一部分等待
    I/O 和用户输入?
  • 多个线程会访问相同的资源还是不同的资源?
  • 线程之间必须进行多少通信?在单个线程和您的进程主线程之间?这需要同步,并引入等待。
  • 事件线程的热点有多“紧”?它的主体可以放入处理器的内存中,还是必须访问(慢得多)总线内存?

  • 作为一般规则,彼此之间的独立线程越多,您的应用程序的扩展性就越线性。然而,在现实世界的业务应用程序中,情况远非如此。提高流程扩展能力的最佳方法是了解它——以及它的依赖关系——然后使用分析器找出最等待发生的地方,看看你是否可以设计技术策略来避免它们。

    关于multithreading - 处理器速度如何跨线程分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17753377/

    相关文章:

    java - 一个线程所做的更改不会反射(reflect)在另一个线程中

    python - 多线程套接字 TCP 服务器

    php - mustache php gettext()

    python - Matplotlib:Web 服务器上的交互式绘图

    java - 线程似乎工作正常但不应该

    java - 将线程和方法与对象同步?

    c# - BenchmarkDotNet InProcessEmitToolchain 完整示例

    c - C 编译器优化的基准

    javascript - 强制粘贴事件以 base64 编码图像

    c# - 为什么添加 DoubleStructs 比添加 double 慢得多?