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

你真的会写for循环吗?来看看这些常见的for循环优化方式

来源: blog.csdn.net/csdn_aiyang/article/details/75162134 前言 我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好...,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。...,违反了最小作用域原则 不能在for循环中操作list的大小,比如除去或新加一个元素 方法三:数组长度提取出来 for (int i = 0, n = list.size(); i < n; i++)...{ System.out.println(list.get(i)); } 优点:不必每次都计算 ,变量的作用域遵循最小范围原则 缺点: m的作用域不够小,违反了最小作用域原则 不能在for循环中操作...for (int i = 0; i < 10; i++) { for (int j = 0; j < 10000; j++) { } } 原因 方法八:循环嵌套提取不需要循环的逻辑 /

36810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Shell学习之常用语句

    /bin/bash for var in $* do echo "$var" #for循环打印所有参数 done 2.命令分隔符分号";" 作用:可以在同一行上写两个或两个以上的命令...,可以精确变量名称(也可以实现字符串替换等,下章来学习) 比如: A=123 echo $AB #错误,将打印空的一行,因为运行时默认会去找变量值AB的解释 echo ${A}B #正常打印...:123B 7.冒号: 空命令,一个什么都不干的命令,该命令的返回值为0(true).....(())双括号 9.1用于for循环时 示例: for(( i=0;i<5;i++));do echo $i;done 9.2转换运算进制时,可以通过(())将任意数据转为10进制 示例: echo...1分 sleep 1h #睡眠1小时 14.变量赋值时的注意 如果变量里存在空白,则必须加上引用 示例: a= 1 2 3 #将会出错,正确的用法应该是a="1 2 3"

    79220

    disruptor笔记之七:等待策略

    ,第三阶段睡眠执行时间,反复的的睡眠 YieldingWaitStrategy:二段式,第一阶段自旋,第二阶段执行Thread.yield交出CPU PhasedBackoffWaitStrategy:...ThreadHints.onSpinWait做了什么,源码如下,这里要格外注意,如果ON_SPIN_WAIT_METHOD_HANDLE为空,意味着外面的while循环是个非常消耗CPU的自旋:...,在锁没有竞争的时候(例如独立消费的场景),会省略掉唤醒操作,不过如下图红框所示,作者说他没有充分验证过正确性,因此建议只用于体验,太好了,这个策略我不学了!!!...的超时处理特性,而且没有锁竞争的时候,省略掉唤醒操作; 作者说LiteBlockingWaitStrategy可用于体验,但正确性并未经过充分验证,但是在LiteTimeoutBlockingWaitStrategy...,因此该策略虽然很消耗CPU,不过一旦其他线程有CPU需求,很容易从这个线程得到; PhasedBackoffWaitStrategy 最后是PhasedBackoffWaitStrategy,该策略的特点是将整个等待过程分成下图的四段

    70820

    【C++】内联函数&auto&范围for循环&nullptr

    2.范围for的使用条件 指针空值nullptr(C++11) 1.C++98中的指针空值 内联函数 1.概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销...2.特性 inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。...inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。 inline不建议声明和定义分离,分离会导致链接错误。...对于第一点的空间是:编译出来的可执行程序 我们来看看第二个点,也就是说:有给inline就一点会展开吗❓ 我们随便给两个内联函数,看看有什么区别: inline int Add(int x, int y...---- 指针空值nullptr(C++11) 1.C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。

    70330

    ava多线程:volatile变量、happens-before关系及内存一致性

    while 循环检测标识变量(hasValue)是否 true,true 表示一个新的值没有被消费,要求当前线程睡眠(sleep),该睡眠一直循环直到标识变量 hasValue 变为 false,只有在新的值被...如果没有有效的新值,consume 方法要求当前睡眠,当一个 produce 方法生成一个新值时,睡眠循环终止,并改变标识变量的值。...2、读线程尝试消费一个值,但是它的缓存副本中 hasValue 被设置为 false,所以即使写线程生产了一个新的值,也不能被消费,因为读线程无法跳出睡眠循环(hasValue 的值为 false)。...3、因为读线程不能消费新生成的值,所以写线程也不能继续,因为标识变量没有设置回 false,因此写线程阻塞在睡眠循环中。 4、这样,就产生了死锁!...我们总能用 Volatile 变量来维护多线程之间的数据一致性吗? 非常不幸,这是不行的。

    73720

    关于 Linux 进程的睡眠和唤醒 ,来看这篇就够了~

    我们可以使用下面的这个函数将刚才那个进入睡眠的进程唤醒。...A 进程的状态仍然是 TASK_RUNNING,所以 wake_up_process() 将 A 进程状态从睡眠状态转变为运行状态的努力 没有起到预期的作用。...然后循环检查条件是否为真:如果是的话就没有必要睡眠,如果条件不为真,就调用 schedule()。...从上面可以看到,Linux 的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态,然后才循环检查条件。...如果在进程开始睡眠之前条件就已经达成了,那么循环会退出并用 set_current_state() 将自己的状态设置为就绪,这样同样保证了进程不会存在错误的进入睡眠的倾向,当然也就不会导致出现无效唤醒问题

    7.7K10

    Erlang 03 - Erlang缺陷

    二者之间唯一可感知的区别就是大整数运算会比小整数运算要来的慢. 在带有密集数值运算大紧凑循环中, 如果给定的输入会导致大量大数运算, 就会产生较为明显的性能差异....Erlang二进制串的语法很强大, 但也容易用错, 要做到运用自如绝非易事, 在循环中处理二进制数据尤其困难....对于恒定不变的数据, 将大型元组用作数组可以提高访问效率, 但更新效率堪忧....设置堆的初始尺寸 如果大量进程在创建之后快速消亡, 那么还可以采取另外一种优化措施: 调大每个进程的初始堆大小, 以避免垃圾回收及进程启动之后的内存分配....接着, 将会强制执行一次垃圾回收, 精简进程的内存占用. 最后, 进程进入睡眠状态, 直到新消息再次进入信箱(若休眠时信箱不为空, 进程将被立即唤醒).

    1.7K30

    关于 Linux 进程的睡眠和唤醒 ,来看这篇就够了~

    我们可以使用下面的这个函数将刚才那个进入睡眠的进程唤醒。...A 进程的状态仍然是 TASK_RUNNING,所以 wake_up_process() 将 A 进程状态从睡眠状态转变为运行状态的努力 没有起到预期的作用。...然后循环检查条件是否为真:如果是的话就没有必要睡眠,如果条件不为真,就调用 schedule()。...从上面可以看到,Linux 的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态,然后才循环检查条件。...如果在进程开始睡眠之前条件就已经达成了,那么循环会退出并用 set_current_state() 将自己的状态设置为就绪,这样同样保证了进程不会存在错误的进入睡眠的倾向,当然也就不会导致出现无效唤醒问题

    2.4K90

    今天,进程告诉我线程它它它它不想活了

    进程是怎么告诉我的?进程的出现和线程的死亡和我有必然联系吗?...同样的,当消费者试图从缓冲区中取数据,但是发现缓冲区为空时,消费者也会睡眠,阻塞。直到生产者向其中放入一个新的数据。...不久之后生产者会填满整个缓冲区,在这之后会阻塞,这样一来两个进程将永远睡眠下去。 引起上面问题的本质是 唤醒尚未进行睡眠状态的进程会导致唤醒丢失。如果它没有丢失,则一切都很正常。...结果是通过忙等待的方式来试图获得锁的线程将永远循环下去,决不会得到锁,因为这个运行的线程不会让其他线程运行从而释放锁,其他线程根本没有获得锁的机会。...在生产者-消费者问题中,很容易将针对缓冲区满和缓冲区空的测试放在管程程序中,但是生产者在发现缓冲区满的时候该如何阻塞呢?

    52810

    【实践】golang pprof 实战-CPU,heap,alloc,goroutine,mutex,block

    输入 list Eat,查看问题具体在代码的哪一个位置: ? image 可以看到,是第 24 行那个一百亿次空循环占用了大量 CPU 时间,至此,问题定位成功!...run") _ = make([]byte, 16 * constant.Mi) } 这里有个小插曲,你可尝试一下将 16 * constant.Mi 修改成一个较小的值,重新编译运行,会发现并不会引起频繁...有重点了解一下“sample_index”这个选项吗? 关于内存的指标,有申请对象数、使用对象数、申请空间大小、使用空间大小,本文用的是什么指标?如何查看不同的指标?...你有听说过火焰图吗?要不要在试验中生成一下火焰图?...…… ——还记得吗,本文的目的是让你熟悉使用 pprof,消除对它的陌生感,并能借用它进一步得了解 golang。

    9.1K32

    由浅入深的了解进程(3)

    ,此时的进程状态是S,可是不对啊,上面说的S不是sleep吗,运行为什么查到的确实sleep的休眠状态。...所以此时的S+休眠状态更准确的描述应该是:进程再等待“资源”就绪。此外这种状态也能够随时中断睡眠。 实际上呢 ....,这么大内存就站着不用,手起刀落,直接把你kill掉,当硬盘处理完回来看数据的时候发现找不到了,没办法,硬盘只能继续再干其余要存储数据的工作了。...所以以后的进程凡是进行数据I/O的需要加上D状态,避免被操作系统删除。 D状态表示为深度睡眠,不可被暂停。** 那么此时进程该怎么取消呢?...这样的话如果数据和代码比较多的话,能够相对而言优化一下内存的容量。当读取数据结束,重新回到运行队列中的时候,再从swap分区中唤出相对应的代码和数据。

    8510

    不存在的,我有线程池

    在threadpool_process_request中,会循环调用do_command处理当前连接的SQL查询。...timer线程每次睡眠的时间由系统参数thread_pool_stall_limit控制。...;这个逻辑percona经过测试认为对性能提升没有太大作用,所以在编译时可以通过宏控制是否包含这部分代码; 线程池的收缩主要通过上面提到的worker线程睡眠超时退出实现; 4. threadpool优化...4.2 低优先队列限制 这个优化还是为了减少上述提到的死锁,在之前的实现中,当worker线程在等待锁或网络IO时会将active_thread_count—,所以就更大可能会导致新的线程的产生,如果这时候高优先级队列为空...4.4 COM_BINGLOG_DUMP优化 这个优化是AliSQL那边实现的。

    3.3K30

    【Java】基础33:用一个案例说明线程同步问题

    ④创建一个循环语句: 因为需要一直卖票,直到票被卖完为止,所以使用循环语句,每循环一次卖一张票,打印卖票信息并且将ticket减一。 ⑤创建MyRunnable对象。 ⑥创建三个线程。...将MyRunnable对象初始化赋值给它,并且给各个窗口命名。 ⑦启动线程。 根据我们前几天学习的线程,我们可以写出这样的代码来实现卖票的需求。 现在看看打印结果: ?...面对这两个问题,我们将代码进一步优化: ? ③加一个判断语句:如果票数小于等于0,就直接结束循环,不执行后面的语句了。 所以当窗口壹打印完第1张票,ticket变成了0。...这时就算窗口贰、窗口叁这两个线程进入了synchronized里面,也会有一个if判断语句中的break直接将循环结束掉。...④让该线程睡眠10毫秒: Thread有一个静态方法sleep(),sleep是睡眠的意思,也就是说窗口壹执行完语句后,会让它睡眠10毫秒,这样的话窗口贰就能进去执行,不然的话根据Java虚拟机的抢占式调度

    63320

    字节跳动的 Go 语言面试会问哪些问题?

    它提示所有的 goroutine 都已经睡眠了,出现了死锁。这是因为 wg 给拷贝传递到了 goroutine 中,导致只有 Add 操作,其实 Done操作是在 wg 的副本执行的。...循环引用。 当对象间发生循环引用时引用链中的对象都无法得到释放。最明显的解决办法是避免产生循环引用,如cocoa引入了strong指针和weak指针两种指针类型。或者系统检测循环引用并主动打破循环链。...循环往复,最后队列为空时,整个图剩下的白色内存空间即不可到达的对象,即没有被引用的对象; 第三轮再次STW,将第二轮过程中新增对象申请的内存进行标记(灰色),这里使用了write barrier(写屏障...)去记录 Golang gc 优化的核心就是尽量使得 STW(Stop The World) 的时间越来越短。...面试官:问个小细节, JSON 标准库对 nil slice 和 空 slice 的处理是一致的吗? 面试者:首先 JSON 标准库对 nil slice 和 空 slice 的处理是不一致的。

    3.4K10

    Linux唤醒抢占----Linux进程的管理与调度(二十三)

    我们发现无效唤醒主要发生在检查条件之后和进程状态被设置为睡眠状态之前, 本来B进程的wake_up_process提供了一次将A进程状态置为TASK_RUNNING的机会,可惜这个时候A进程的状态仍然是...TASK_RUNNING,所以wake_up_process将A进程状态从睡眠状态转变为运行状态的努力没有起到预期的作用. 4.3 避免无效抢占 要解决这个问题, 必须使用一种保障机制使得判断链表为空和设置进程状态为睡眠状态成为一个不可分割的步骤才行...然后循环检查条件是否为真: 如果是的话就没有必要睡眠, 如果条件不为真, 就调用schedule 当进程检查的条件满足后, 进程又将自己设置为TASK_RUNNING并调用remove_wait_queue...从上面可以看到, Linux的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态, 然后才循环检查条件....如果在进程开始睡眠之前条件就已经达成了, 那么循环会退出并用set_current_state将自己的状态设置为就绪, 这样同样保证了进程不会存在错误的进入睡眠的倾向, 当然也就不会导致出现无效唤醒问题

    4K30

    线程、进程通信原理让你彻底整明白

    同样的,当消费者试图从缓冲区中取数据,但是发现缓冲区为空时,消费者也会睡眠,阻塞。直到生产者向其中放入一个新的数据。...不久之后生产者会填满整个缓冲区,在这之后会阻塞,这样一来两个进程将永远睡眠下去。 引起上面问题的本质是 唤醒尚未进行睡眠状态的进程会导致唤醒丢失。如果它没有丢失,则一切都很正常。...down 这个指令的操作会检查值是否大于 0 。如果大于 0 ,则将其值减 1 ;若该值为 0 ,则进程将睡眠,而且此时 down 操作将会继续执行。...结果是通过忙等待的方式来试图获得锁的线程将永远循环下去,决不会得到锁,因为这个运行的线程不会让其他线程运行从而释放锁,其他线程根本没有获得锁的机会。...在生产者-消费者问题中,很容易将针对缓冲区满和缓冲区空的测试放在管程程序中,但是生产者在发现缓冲区满的时候该如何阻塞呢?

    90320

    pprof性能调优实战|青训营笔记

    通过这个面板可以先大致了解程序运行情况,并定位可能出现性能问题的位置,下面将具体排查各个问题。 优化CPU占用 我们先来看一下在活动监视器中该程序CPU占用情况:45.3%恐怖!...定位到Eat方法占用资源最多之后,使用 listEat命令排查看出问题的代码具体是什么内容: 这里看到for循环执行了3.8s的时间,是问题所在。...可以看到,这个for循环不断给m.buffer追加1MB的内容,并设定上限1GB,暂未看到内存的释放,所以推测这就是程序占用高内存的原因。...执行 listDrink,定位到了Drink方法中每调用一次Drink()都会创建10个协程,然后睡眠30秒结束。 再照常使用一下 web命令,可以看到可视化的协程的创建情况。...依旧是将这部分循环创建协程的无意义代码注释掉,重启程序,再次查看pprof监测面板,协程的数量降低到了6,优化完成。

    59920
    领券