首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的合并排序使用线程比不使用线程慢?

合并排序是一种常见的排序算法,它通过将待排序的数组递归地分成两个子数组,然后将两个子数组合并成一个有序的数组。在没有使用线程的情况下,合并排序是串行执行的,即按照顺序依次执行每个步骤。而使用线程可以将任务并行化,加快排序的速度。

然而,如果你的合并排序使用线程比不使用线程慢,可能是由于以下原因:

  1. 线程创建和销毁的开销:线程的创建和销毁需要一定的时间和资源。如果你的数组规模较小,线程的创建和销毁所花费的时间可能超过了并行执行的时间,导致使用线程的合并排序比串行执行的合并排序慢。
  2. 线程间的通信开销:在使用线程进行并行计算时,线程之间需要进行通信和同步。这涉及到线程间的数据传输和互斥操作,可能会引入额外的开销。如果你的合并排序中线程间的通信开销较大,可能会导致使用线程的合并排序比串行执行的合并排序慢。
  3. 线程调度开销:在使用线程进行并行计算时,操作系统需要对线程进行调度,确保每个线程都能够得到执行。线程的切换和调度可能会引入一定的开销。如果你的合并排序中线程的调度开销较大,可能会导致使用线程的合并排序比串行执行的合并排序慢。

针对以上问题,可以尝试以下优化措施:

  1. 考虑使用线程池:线程的创建和销毁是比较耗时的操作,可以通过使用线程池来重用线程,减少创建和销毁的开销。
  2. 调整线程数量:合适的线程数量可以提高并行计算的效率。过多的线程数量可能会导致线程间的竞争和调度开销增加,而过少的线程数量可能无法充分利用计算资源。可以通过实验和性能测试来确定最佳的线程数量。
  3. 减少线程间的通信:可以尝试减少线程间的数据传输和互斥操作,避免不必要的通信开销。可以考虑使用更高效的数据结构或算法来减少线程间的依赖关系。
  4. 考虑使用并行排序算法:除了合并排序,还有其他一些并行排序算法,如快速排序的并行版本。可以尝试使用这些算法来提高排序的速度。

总之,合并排序使用线程比不使用线程慢的原因可能涉及线程创建和销毁的开销、线程间的通信开销和线程调度开销。通过优化线程的使用方式、调整线程数量、减少线程间的通信和考虑使用并行排序算法等措施,可以尝试提高合并排序的性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

我会手动创建线程为什么使用线程池?

上一篇文章 面试问我,创建多少个线程合适?该怎么说 从定性到定量分析了如何创建正确个数线程来最大化利用系统资源(其实就是几道小学数学题)。...通常来讲,有了个这个知识点傍身,按需手动创建相应个数线程就好 但是现实中,你也许听过或者被要求: 尽量避免手动创建线程,应使用线程池统一管理线程 为什么会有这样要求?背后道理又是怎样呢?...禁止使用Executors创建线程池 相信很多人都看到过这个问题(阿里巴巴Java开发手册说明禁止使用 Executors 创建线程池),把出处(P247)截图在此: ?...Executors 大大简化了我们创建各种类型线程方式,为什么还不让使用呢? 其实,只要你打开看看它静态方法参数就会明白了 ?...为什么建议所有业务共用一个线程池?有什么缺点? 给线程池设置指定前缀,有哪些方式?

1.1K20

我会手动创建线程为什么使用线程池?

通常来讲,有了个这个知识点傍身,按需手动创建相应个数线程就好 但是现实中,你也许听过或者被要求: 尽量避免手动创建线程,应使用线程池统一管理线程 为什么会有这样要求?背后道理又是怎样呢?...可以看到,使用线程池不但能完成手动创建线程可以做到工作,同时也填补了手动线程不能做到空白。...因此,通过配置独立线程池,将较慢交易服务与搜索服务个离开,避免个服务线程互相影响 相信到这里,你已经了解线程基本思想了,在使用过程中还是有几个注意事项要说明一下 线程使用思想/注意事项 不能忽略线程池拒绝策略...禁止使用Executors创建线程池 相信很多人都看到过这个问题,把出处(P247)截图在此: ?...Executors 大大简化了我们创建各种类型线程方式,为什么还不让使用呢? 其实,只要你打开看看它静态方法参数就会明白了 ?

71230

为什么推荐使用 stop、suspend 方法中断线程

java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java历史舞台而又渐渐推出了舞台呢?...我们从中可以看出以下几点: stop这种方法本质上是不安全 使用Thread.stop停止线程会导致它解锁所有已锁定监视器,即直接释放当前线程已经获取到所有锁,使得当前线程直接进入阻塞状态 我们举例来看一下上边提到两点...因此使用stop我们在不知道线程到底运行到了什么地方,暴力中断了线程,如果sleep后代码是资源释放、重要业务逻辑等比较重要代码的话,亦或是其他线程依赖t1线程运行结果,那直接中断将可能造成很严重后果...那么建议使用stop中断线程我们应该怎么去优雅结束一个线程呢,我们可以存java开发者注释中窥探到一种解决方案: Many uses of stop should be replaced by code...可以看到java开发者推荐我们使用以下两种方法来优雅停止线程。 1.定义一个变量,由目标线程去不断检查变量状态,当变量达到某个状态时停止线程

48420

为什么推荐使用 stop、suspend 方法中断线程

我们知道像stop、suspend这几种中断或者阻塞线程方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java历史舞台而又渐渐推出了舞台呢?...我们从中可以看出以下几点: stop这种方法本质上是不安全 使用Thread.stop停止线程会导致它解锁所有已锁定监视器,即直接释放当前线程已经获取到所有锁,使得当前线程直接进入阻塞状态 我们举例来看一下上边提到两点...因此使用stop我们在不知道线程到底运行到了什么地方,暴力中断了线程,如果sleep后代码是资源释放、重要业务逻辑等比较重要代码的话,亦或是其他线程依赖t1线程运行结果,那直接中断将可能造成很严重后果...那么建议使用stop中断线程我们应该怎么去优雅结束一个线程呢,我们可以存java开发者注释中窥探到一种解决方案: Many uses of stop should be replaced by code...最后,关注公众号Java技术栈,在后台回复:面试,可以获取整理 Java 多线程系列面试题和答案,非常齐全。

77630

Java为什么建议使用Executors来创建线程池呢?

终止并从缓存中移除那些已有 60 秒钟未被使用线程。...它实现了一个基于链接节点可选容量阻塞队列。此队列按 FIFO(先进先出)排序元素。队列头部是在队列中存在时间最长元素,队列尾部是在队列中存在时间最短元素。...LinkedBlockingQueue 是一个线程安全队列,它内部使用了锁和条件变量来保证多线程环境下正确性和一致性。...LinkedBlockingQueue 主要特点就几个 容量可选 阻塞操作 非阻塞操作 线程安全 高效并发性能 为什么说容量可选呢?...所以我们推荐直接使用 Executors 来创建线程池,但是我们更推荐使用 ThreadpoolExecutor创建线程池。

17310

什么是线程组,为什么在 Java 中推荐使用

线程组是使用 Java 线程进行管理和组织一种模型。...在线程组中,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。 在 Java 中,虽然线程组是一种功能强大机制,但实际上并不推荐使用。...在实践中,像 Executor 这样 API 已经为线程管理提供了更加强大、可控解决方案,相比之下,线程组已经逐渐退出 Java 中被广泛使用范畴。...3、容易引起歧义 在 Java 中,虽然 ThreadGroup 设计旨在通过将一组线程分到同一个容器中来轻松管理和控制它们,但如果使用错误,可能会导致线程状态。...因此,在 Java 中,线程组已基本过时,推荐使用 Executor 框架等新更实用工具来进行线程管理。

24120

推荐使用executors创建线程池_创建线程几种方式

大家好,又见面了,是你们朋友全栈君。  java中线程创建除了使用ThreadPoolExecutor之外,还可以使用Executors静态方法来获取不同线程池。...ScheduledThreadPoolExecutor该方法设置参数 * @param command 要承担线程任务 * @param initialDelay 入池线程开启时间(从入池开始计时...,基本可以实现日程中对线程需求但是并不推荐使用,原因是使用Executors创建线程池不会传入线程池具体参数而是使用默认值所以我们常常忽略这些参数,从上面的源码中我们可以看到,Executors静态方法实际上还是调用...ThreadPoolExecutor来创建线程池,只不过,它将绝大多数参数用默认值代替,而只给我们留下了关心个别参数。  ...最近阿里发布 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 方式,这样处理方式让写同学更加明确线程运行规则,规避资源耗尽风险

62610

为什么建议使用框架默认 DefaultMeterObservationHandler

为什么建议使用框架默认 DefaultMeterObservationHandler 背景知识 最近,我们升级了 SpringBoot 3.x,并且,升级后,我们全面改造了原来 Sleuth 以及...全面使用 Observation 遇到了内存溢出以及 CPU 飙高(非不断 GC 导致) 但是,我们在全面使用 Observation 时候,发现了一个问题,就是内存溢出以及 CPU 飙高(非不断 GC...$SampleImpl 对象,导致多线程 stop 时候 CPU 飙高。...我们将全局 ObservationHandler 改为什么都不做,对比下: package com.github.hashjang.wwsmbjysymrdo; import io.micrometer.common.KeyValue...并且,LongTaskTimer.Sample 对象在 stop 时候,因为多线程原因可能 ConcurrentLinkedQueue 很大导致 CPU 飙高。

3900

从源码讲为什么推荐使用Vector以及集合线程安全问题

加了synchronized关键字就一定安全了吗 不一定   vector读写操作 本身都是线程安全,但是如果我们有些线程连续调用了两个或两个以上同步方法,依然会出现安全问题,举个栗子:...Vector时候线程并不是安全使用get访问Vector时出现了越界。...这是为什么呢?   Vector类中对get以及remove,size方法都加了synchronized关键字来保证同步,也就说当一个线程调用了这些方法时,其他线程不能再同时调用这些方法。...换言之,不能出现两个及两个以上线程在同时调用这些同步方法。   那么为什么例子中会出现问题呢?这是因为 例子中有些线程连续调用了两个或两个以上同步方法。   ...而关于同步这个问题,我们可以使用Collections这个工具类,将我们需要线程安全集合转换一下,而不是直接使用Vector Collections 可以增加代码灵活度,在我们需要同步是时候就通过如下代码实现

45050

如何创建一个线程池,为什么推荐使用Executors去创建呢?

我们在学线程时候了解了几种创建线程方式,比如继承Thread类,实现Runnable接口、Callable接口等,那对于线程使用,也需要去创建它,在这里我们提供2种构造线程方法: 方法一:...在这里插入图片描述 方法二: 通过 Executor 框架工具类 Executors 来创建(推荐)   Executors 是java并发工具包中一个静态工厂类,在JDK1.5时被创造出来,提供了丰富创造线程方法...为何很多大厂都禁止使用Executors 创建线程池呢?    ...而CachedThreadPool使用是同步队列 SynchronousQueue, 允许创建线程数量也为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量线程...,从而导致 OOM,其他方法所提供均是这种无界任务队列,在高并发场景下导致OOM风险很大,故大部分公司已经建议采用Executors提供方法创建线程池了。

6910

JEP 尝鲜系列 3 - 使用线程进行同步网络 IO 阻塞原理

为了解决这个限制,我们通常使用异步 I/O 或 Ractor 框架,因为它们可以构造出在 I/O 操作中不用绑定线程代码,而是在 I/O 操作完成或准备就绪时使用回调或事件通知线程进行处理。...使用异步和非阻塞 API 使用同步 API 更具有挑战性,部分原因是用这些 API 写出来代码是比较反人类。...在本文中,我们将查看 Java 平台网络 API 在虚拟线程上被调用时是如何工作。了解底层细节,我们才能更好地、更放心地使用虚拟线程(纤程)。...平台线程(即目前 Java 平台线程),是和操作系统内核线程一一对应。平台线程通常拥有一个非常大栈,以及其他一些系统维护资源。虚拟线程使用一小组用作载体线程平台线程。...使用 Windows 进行测试,在 Windows 中 poller 底层实现基于 wepoll,所以我们看到堆栈里面包含 WEPoll。

66310

Go语言中常见100问题-#56 Concurrency isn’t always faster

CPU内核执行不同线程,当它从一个线程切换到另一个线程执行时,会执行一个上下文切换操作。正在使用CPU活动线程从处于执行状态变为可运行状态。可运行状态意味着线程已准备好执行但在等待CPU....归并排序算法工作原理是将一个数组重复分解为两个子数组,直到每个子数组中包含一个元素,然后按顺序合并这些子数组,从而得到一个排序数组。...goroutine上执行,父goroutine使用sync.WaitGroup等待两个子goroutine完成各个子数组排序之后,再将它们合并为一个有序数组。...现在我们已经实现了一个串行版本和一个并行版本归并排序算法,下面通过性能测试benchmark进行验证,那么一定是并行版本更快吗?下面对一个有1万个元素切片在4核机器上测试结果。...为什么会是这样呢?利用4个核分配工作任务并行版本怎么可能串行版本呢?

37140

求求你们了,别再乱用 parallelStream 了,速度竟然 Stream 还要!!

现在你可能会有疑问了,为什么会这样? 栈长起初也有疑问,并行流(ParallelStream)怎么会比顺序流(Stream)还要。。...其实后面想想也就明白了,并行流(ParallelStream)背后其实是 Java7 开始支持 Fork/Join,即把一个大任务拆分成 N 个小任务,然后最终合并各个子任务结果,所以对于子任务线程拆分...、创建、结果合并等操作都需要不少开销,特别是线程创建。...所以这种耗时简单排序操作事实上是不适用于并行流(ParallelStream),它所带来线程创建损耗可能还会比顺序流(Stream)还要更慢。...总结 稍微总结下: stream: 适用于避免线程安全问题、要求顺序执行、数据处理简单耗时任务; parallelStream: 适用于不存在线程安全问题、不需要顺序性执行、数据处理比较耗时任务;

77520

Java如何定位自己项目中业务

定位业务问题 首先我们先来说这么业务问题,一般业务问题,总归就那么几种,SQL 问题,代码业务问题,前端解析问题,前端解析问题我们就不说了,为什么呢?...如果这时候每个月数据计算相互都是独立,我们完全可以采用多线程方式进行: // 建立一个线程池,注意要放在外面,不要每次执行代码就建立一个,具体线程使用就不展开了 public static ExecutorService...常用于非主键和唯一索引扫描 ref_or_null:这种连接类型类似于ref,区别在于MySQL会额外搜索包含NULL值行 index_merge:使用了索引合并优化方法,查询使用了两个以上索引...key_len 实际使用索引长度 rows 该列表示MySQL估算找到我们所需记录,需要读取行数 filtered 该列是一个百分,是满足条件记录数量与我们查询了多少记录数量比值 extra...该字段包含有关MySQL如何解析查询其他信息,它一般会出现这几个值: Usingfilesort:表示按文件排序,一般是在指定排序和索引排序不一致情况才会出现,一般见于order by语句 Using

62620

Mapreduce shuffle详解

在每个分区中后台线程按键进行内排序,如果有一个combiner,它就在排序输出上运行。运行combinner使得map输出结果更紧凑,因此可以减少写到磁盘数据和传递给reducer数据。...在MRV2中使用netty进行数据传输,默认情况下netty工作线程数是处理器数2倍。MRV1中,默认值是40,由tracker.http.threads来在tasktracker端设定。...如果map输出相当小,会被复制到reduce任务JVM内存(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,指定用于此用途堆空间百分),否则,...如果指定combiner,则在合并期间运行它已降低写入磁盘数据量。 随着磁盘上副本增多,后台线程会将它们合并为更大排序文件。这会为后面的合并节省一些时间。...复制完所有的map输出后,reduce任务进入排序阶段(更加恰当说法是合并阶段,因为排序是在map端进行),这个阶段将合并map输出,维持其顺序排序。这是循环进行

1.3K41

Elasticsearch 检索性能优化实战指南

1、当我们在说 Elasticsearch 检索性能优化时候,实际在说什么?! 检索响应! 并发检索用户多时,响应时间达标 卡死了! 怎么还没有出结果? 怎么这么?...且:Nested 可以使查询几倍,而父子 Join 类型可以使查询数百倍。 大家在建模时候多考虑,如果刻意建模全部使用默认字段,看看可能带来“灾难”性后果,反过来就能理解建模重要性。...推荐阅读: 吃透 | Elasticsearch filter和query不同 13、对历史索引数据使用合并 前提:基于时间切分索引,对于相对冷数据,访问密集型没有那么高数据,推荐使用合并。...自己早些年线上环境实现曾经大量使用:wildcard,导致客户现场演示宕机,自己因此也写了“检讨书”,血淋淋教训再次告诉大家。 几年后回头看当时为什么选型 wildcard?...在业务开发中使用全量聚合目的是规避聚合结果精准性,但是带来则是性能问题。 多重嵌套聚合随之嵌套层数增多,复杂度也会激增,检索响应速度会变慢甚至带来性能问题。

1.7K31

字节国际支付十连问

等) 一张表字段不宜过多 尽可能使用not null定义字段 设计表时,评估哪些字段需要加索引 不需要严格遵守3NF,通过业务字段冗余来减少表关联 避免使用MySQL保留字 搞外键关联,一般都在代码维护...TCP为什么需要四次挥手?三次行不行呢? 举个生活例子吧,假设小明和小红打电话聊天,通话差不多要结束时: 小红说,“没啥要说了”。小明回答,“知道了”。...你平时是如何优化SQL 数据库查询主要有这些原因 如果是SQL没加索引,那就加恰当索引 如果 SQL 索引生效,那就关注索引失效十种经典场景(如不满足最左匹配原则等) 关注limit深分页问题...order by 走文件排序 拿不到锁 delete + in子查询走索引!...详细讲解,大家可以看下之前这篇文章哈:盘点MySQL查询12个原因 10.十亿个数字里里面找最小10个 这是一道经典TopK问题,可以使用分治法+快速排序原理解决。

58410

最全阿里面试题:已拿offer,阿里P8岗位完整阿里技术面试题目,这些面试题你能答出多少

(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据时候都认为别人不会修改,所以 会上锁,但是在更新时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本 号等机制。...第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认行锁, 仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考 虑使用表锁来提高该事务执行速度。...五面: list set map 底层使用什么实现有哪些典型实现 hashmap 扩容是怎么扩容为什么是 2 幂 concurrenthashmap 为什么线程安全,采用了什么措施应对高并发 线程参数有什么意义...(以行为单位,每行超过 10 个字符) 2.设计一个算法,实现两个 10g 大文件在 10m 内存中将两个大文件中重复放进第三个 文件 3. 快速排序平均复杂多少?最坏情况是什么?...乐观锁如何保证线程安全? 22. 用过线程池吗,对应好处,如何用? 23. 两个 10G 文件,里面是一些 url,内存只有 1G,如何将这两个文件合并,找到相同 url?

76020

蚂蚁金服面经(3+4)

4高并发情况下,如何使用线程池,用哪个,问了一下线程结束要多久,是否在下一个线程结束前完成(是cachethreadpool,其实思路错了)。...说了BIO阻塞用法,以及NIOIO多路复用用法,说了selector,seletedkey,channel等类使用流程,以及单线程处理连接,多线程处理IO请求好处。...2 bytebuf支持零拷贝,通过逻辑buff合并实际buff。   3 eventloop线程组负责实现线程池,任务队列里就是io请求任务,类似线程池调度执行。  ...题目是链表排序,扯了4、5种方案,转成数组,直接排序,拆分再排序,顺序连接等等。。然后表示不能再优化了。他就说没别的问题了。。。...有点吃惊 HR面:   1 兴趣爱好 2 三年到五年职业规划 3 意向公司和城市 4 实习经历和收获 5 实习中最大困难 6 为什么换公司,为什么拒绝菜鸟实习offer 7 你缺点和优点 8 你觉得你其他人优秀地方说三个

65320

亿级数据mysql优化

分表分库 对于大数据查询,第一反应就是分表分库,之前对分表分库已经听很多了,但自己之前并没有真的做过分表分库。...分表其实只是对数据表数据量减少。比如一个1亿表,经过分表后,会分成4个千万级别的表,对于查询sql,会在千万级别的表中执行,并把结果合并起来。...在亿级查询时间千万级会提高很多,这个就是分表作用。但是分表仅仅是数据量减少,并没有去解决查询问题,如果一个查询,及时使用分表,它还是很慢。...首先就是 加索引 索引要加给需要查询列,对于执行sql,我们要使用EXPLAIN进行查询分析,看查询是否走索引。...sending data耗时来源于sending和sort时间之和,去掉排序,时间也能快很多。

91410
领券