for循环效率
For循环嵌套的效率
For循环嵌套的效率有人说,两个嵌套的for循环,把循环次数多的放在里面,效率会比较高。
这是个老话题了。
网上的讨论很多。
我记得我第一次见到这个问题的时候还在上高中。
今天就简单的总结一下吧。
先上代码:void test1(){long dt = DateTime.Now.Ticks;for (int i = 0; i < 1000000; i++){for (int j = 0; j < 10; j++){a[i,j] = 0;}}Console.WriteLine("test1:{0}",DateTime.Now.Ticks - dt);}void test2(){long dt = DateTime.Now.Ticks;for (int j = 0; j < 10; j++){for (int i = 0; i < 1000000; i++){a[i,j] = 0;}}Console.WriteLine("test2:{0}",DateTime.Now.Ticks - dt);}有书上说是方法2快,道理是大的循环放在里面,效率会比较高。
不过实际的结果,一般都是方法1快,而且快很多。
这是为什么呢?这是因为当CPU从内存获取数据到cache的时候,是一块一块获取的。
因此,如果我们的程序总是顺序的访问内存,那么cache的利用率就会比较高了,会大大减少系统换页的次数,提高程序运行的效率。
对于多维数组,每行的最后一个数据后面,紧接着的是下一行的第一个。
因此,方法1是顺序访问内存,方法2则是跳跃性的访问内存。
这样一来,谁快谁慢自然就很明了了。
不过,并不能因此就说书上说错了,更不能说把大的循环放在外面才会更高效。
再看下面的代码:void test3(){long k = 0;long dt = DateTime.Now.Ticks;for (int i = 0; i < 1000000; i++){for (int j = 0; j < 10; j++){k++;if (k > 100000)k++;}}Console.WriteLine("test3:{0}",DateTime.Now.Ticks - dt);}void test4(){long k = 0;long dt = DateTime.Now.Ticks;for (int j = 0; j < 10; j++){for (int i = 0; i < 1000000; i++){k++;if (k > 100000)k++;}}Console.WriteLine("test4:{0}",DateTime.Now.Ticks - dt);}实际的测试结果支持了大循环在内部会快一些的说法,虽然快的幅度很有限吧。
c遍历数组效率最高方法
c遍历数组效率最高方法C语言是一种高效的编程语言,它提供了多种方法来遍历数组。
在C中,数组通常是一系列相同类型的元素的集合。
下面将介绍一些C语言中效率最高的数组遍历方法。
1. for循环遍历:for循环是C语言中最常用的循环结构,也是遍历数组的一种常见方法。
使用for循环,可以通过控制循环变量的增量来遍历整个数组。
例如,要遍历一个长度为n的数组arr,可以使用以下代码:```cint i;for(i = 0; i < n; i++) {//对数组元素进行操作}```2. while循环遍历:除了for循环,还可以使用while循环来遍历数组。
while循环适用于不确定遍历次数的情况。
以下是一个使用while循环遍历数组的示例代码:```cint i = 0;while(i < n) {//对数组元素进行操作i++;}```3.指针遍历:在C中,数组名本身就是数组的指针,指向数组的首元素。
因此,可以使用指针来遍历数组。
以下是一个使用指针遍历数组的示例代码:```cint i;int *ptr = arr;for(i = 0; i < n; i++) {//对数组元素进行操作ptr++;}```4.使用指针和指针算术运算符:C语言中的指针算术运算符允许我们通过指针进行加法和减法运算。
因此,可以使用指针算术运算符来遍历数组。
以下是一个使用指针算术运算符遍历数组的示例代码:```cint i;int *ptr = arr;for(i = 0; i < n; i++) {//对数组元素进行操作ptr++;}```5.嵌套循环遍历多维数组:如果数组是多维的,可以使用嵌套循环来遍历多维数组。
以下是一个使用嵌套循环遍历二维数组的示例代码:```cint i, j;for(i = 0; i < rows; i++) {for(j = 0; j < columns; j++) {//对数组元素进行操作}}```需要注意的是,以上提到的遍历方法都是基于顺序访问数组的前提下进行的。
for循环语句基本用法及示例
for循环语句基本用法及示例for循环语句是在编程中最常用的循环控制结构之一,它可以帮助你按序地执行一组语句,可以使你的程序变得更加有效率、灵活、简洁。
它的一般基本语法格式为:for(初始化; 循环条件; 迭代器){循环体;}其中for循环语句由3个部分组成:1)初始化:仅在循环开始之前执行一次,一般用于声明变量并将其初始化;2)循环条件: 常用于控制执行循环的次数,当循环条件的结果为false时,循环结束;3)迭代器:通常用于更新变量值,每次循环末尾执行一次,如增量或减量。
下面利用for循环来计算1+2+3+···+10的和:int total = 0;for(int i=1; i<=10; i++){total += i;}System.out.println("结果:"+total);上面程序的代码中,首先进行初始化工作,声明一个int类型变量total用于保存计算结果,同时声明另一个int类型变量i用于控制循环,其初始值设定为1。
然后把循环条件设为i<=10,也就是只有当i的值小于等于10时,循环才能继续下去,这就可以达到控制循环次数的效果。
最后设定每次循环末尾的迭代器(i++),它的作用是使i的值从1每次循环增加1,最终当i的值为11时,满足循环条件i<=10失败,循环结束。
下面再看一下利用for循环计算10的阶乘的示例程序:通过上面两个示例,你可以学会如何正确使用for循环,并且你也可以根据自己的需要定制出各种形式的for循环,以处理大量的重复任务,如果你不清楚for循环怎么使用,可以结合我们上面的示例程序,加以理解,并一起做些练习,不断摸索,慢慢就能掌握for循环语句这一重要的控制结构了。
python中两个for循环的用法 -回复
python中两个for循环的用法-回复标题:Python中的双重for循环:提升效率、增强灵活性引言:在Python编程语言中,循环结构是一种非常强大且常用的控制流工具。
其中,双重for循环是一种特殊的循环结构,其运用广泛且能够提升代码的效率和灵活性。
本文将重点探讨在Python中如何使用双重for循环,并通过实例演示不同应用场景下的技巧和技术,以帮助读者充分运用这一强大工具。
第一部分:双重for循环的基本概念及语法1.1 什么是双重for循环双重for循环指的是在一个循环内嵌套另一个循环结构,通过这种方式可以对两个不同的可迭代对象进行迭代遍历、组合或操作。
双重for循环是一种迭代嵌套的结构,内层循环在外层循环的每一次迭代中都会执行一次,从而完成对两个可迭代对象的全排列或组合遍历。
1.2 双重for循环的语法双重for循环的语法结构如下所示:pythonfor 变量1 in 可迭代对象1:for 变量2 in 可迭代对象2:# 执行语句块其中,变量1和变量2分别用于遍历可迭代对象1和可迭代对象2。
在循环体中可以执行一系列语句块,以实现对可迭代对象的操作。
第二部分:双重for循环的常见应用2.1 矩阵遍历在本应用场景中,双重for循环用于对矩阵的行和列进行遍历。
我们可以使用两个嵌套的循环来遍历矩阵,通过变量1和变量2来分别获取行和列中的元素。
这使得我们可以对矩阵中的每个元素进行操作或分析。
pythonmatrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]for row in matrix:for element in row:print(element)上述代码将逐行输出矩阵中的所有元素。
通过修改循环体中的代码,我们可以对每个元素进行进一步处理,例如求和、计算平均值等。
2.2 数据统计和分析双重for循环也可以用于对多维数据结构进行统计和分析。
例如,假设我们有一组学生成绩数据,其中每个学生有多个科目的成绩。
for循环概念
For循环的概念For循环是一种在程序中重复执行特定代码块的控制结构。
它由一个初始化语句、一个条件语句和一个迭代语句组成。
初始化语句在循环开始前执行一次,设置循环变量的初始值。
条件语句在每次迭代前检查循环变量的值,如果条件为真,则执行循环体中的代码块,否则跳出循环。
迭代语句在每次迭代后更新循环变量的值。
在每次迭代结尾,条件语句会再次被检查,循环会继续重复直到条件为假。
For循环的重要性For循环是大多数编程语言中最常用的循环结构之一,它具有以下重要性:1.精确地控制循环次数:通过初始化语句、条件语句和迭代语句的结合,可以精确地控制循环的次数,从而使代码按预期方式执行。
这对于需要重复执行相同或类似操作的情况非常有用,如处理列表、数组、矩阵等。
2.提高代码的可读性:For循环在只需几行代码的情况下可以实现对大量数据的迭代处理,使得代码更加简洁、易读。
相比于使用while循环,for循环提供了一种更直观的方式来描述循环次数的范围,使得程序员更容易理解循环的含义。
3.减少错误和重复:通过将循环控制的逻辑集中在一起,使用for循环可以减少因疏忽或复制粘贴错误而产生的错误。
循环的迭代逻辑只需在一个地方定义,避免了重复编写相同的代码,提高了代码的可维护性。
4.提高代码执行效率:使用for循环可以将重复的操作集中在一起,减少了程序的重复计算和存储开销。
对于大量数据的处理,使用for循环可以有效地提高代码的执行效率。
For循环的应用For循环在各种编程语言中广泛应用于多个领域和场景,下面是一些常见的应用示例:1.遍历数组和列表:For循环可以用于逐个访问数组或列表中的元素。
通过设置循环变量的范围,可以在循环体中对每个元素进行处理、计算或输出。
words = ["Hello", "World", "!"]for word in words:print(word)输出:Hello World !2.计数器循环:For循环可以用于重复执行一定次数的操作,其中使用的循环变量可将其作为计数器。
pycharm中for循环用法
pycharm中for循环用法在PyCharm中,for循环是一种非常常见和有用的循环结构,用于对集合中的元素进行迭代。
通过使用for循环,我们可以简化代码,同时提高代码的可读性和效率。
在本文中,我们将详细讨论for循环的用法,并提供一些示例来说明其灵活性和多样性。
1. 基本语法:for 变量名in 集合:执行语句在for循环的语法中,我们需要定义一个迭代变量,以及一个可迭代的集合。
在每次循环迭代时,变量会自动从集合中取出一个元素,并执行相应的语句块。
2. 集合类型:在for循环中,我们可以使用多种集合类型,包括字符串、列表、元组和字典等。
这些集合中的每个元素都可以作为变量在循环过程中使用。
下面是一些集合类型的示例:- 字符串:string = "Hello, World!"for char in string:print(char)上述代码将迭代字符串中的每个字符,并将其打印出来。
- 列表:numbers = [1, 2, 3, 4, 5]for num in numbers:print(num)在上面的示例中,我们迭代了一个包含数字的列表,并将每个数字打印出来。
- 元组:fruits = ("apple", "banana", "cherry")for fruit in fruits:print(fruit)上述代码将迭代一个包含水果名称的元组,并将每个水果名称打印出来。
- 字典:student_scores = {"Alice": 90, "Bob": 80, "Charlie": 95}for name, score in student_scores.items():print(name, score)在上面的示例中,我们使用.items()方法来迭代字典中的每个键值对,并将键和对应的值打印出来。
excel表格中循环函数
excel表格中循环函数Excel是一款功能强大的表格软件,使用方便,可以进行各种各样的数据处理,包括statistical, engineering, and financial functions. 循环函数是Excel中一种能够方便地重复运行操作的函数,循环函数可以将我们的工作效率提高数倍,这篇文章将为大家介绍Excel中的循环函数。
1. FOR循环函数:FOR循环函数是Excel中非常常见的循环函数之一,它让程序有能力执行同样的代码多次,对于需要重复执行的任务,FOR循环函数是最好的选择之一。
FOR循环函数运行时要注意两个方面,循环的次数和循环的条件。
循环的次数的决定方式是由代码指定的,循环的条件改变的时候代码才会停止。
2. DO循环函数:DO循环函数是Excel中另外一种常见的循环函数,它与FOR循环函数非常相似,但是它的条件判断和FOR循环函数不同。
DO循环函数在开始执行之前就会检查条件是否满足,如果不满足条件就会结束循环。
DO循环函数需要注意的一点是,无论是否满足条件,它都会运行一次,而后再判断条件,这是和FOR循环函数的不同之处。
3. WHILE循环函数:WHILE循环函数是一个基于测试条件是否成立来执行代码块的循环结构,只要表达式的结果为True,就会重复运行循环代码块。
当表达式的结果为False时,循环就会停止,程序开始执行下一个语句。
WHILE循环函数是一个最简单的循环函数之一,通常用于循环次数不确定情况下的快速处理数据。
4. FOR EACH循环函数:FOR EACH循环函数通常用于迭代数组或者集合中的每一个元素,它会一次遍历数组或集合中的每一项,然后执行某些操作。
FOR EACH循环函数简化了数组或集合的操作,省略变量的定义,从而避免了冗长的代码。
总结:循环函数是Excel中一种非常重要的函数,可以让程序执行重复的任务。
对于需要重复执行的操作,循环函数是非常有用的。
Excel中的循环函数有很多种,每一种都有自己的优点和局限性,需要根据实际情况进行使用。
map、foreach和for循环区别
map、foreach和for循环区别⼀、foreach和for循环区别1.在固定长度或者长度不需要计算的时候for循环效率⾼于foreach,在不确定长度或者计算长度有损性能的时候⽤foreach⽐较⽅便2.foreach适⽤于只是进⾏集合或数组遍历,for则在较复杂的循环中效率更⾼。
3.如果对集合中的值进⾏修改,就要⽤for循环了。
其实foreach的内部原理其实也是Iterator,但它不能像Iterator⼀样可以⼈为的控制,⽽且也不能调⽤iterator.remove();更不能使⽤下标来访问每个元素,所以不能⽤于增加,删除等复杂的操作。
4.forEach相⽐普通的for循环的优势在于对稀疏数组的处理,会跳过数组中的空位。
⼆、⼤多数情况下,我们都要对数组进⾏遍历,然后经常⽤到的两个⽅法就是forEach和map⽅法。
先来说说它们的共同点相同点都是循环遍历数组中的每⼀项forEach和map⽅法⾥每次执⾏匿名函数都⽀持3个参数,参数分别是item(当前每⼀项),index(索引值),arr(原数组)匿名函数中的this都是指向window只能遍历数组都不会改变原数组区别map⽅法1.map⽅法返回⼀个新的数组,数组中的元素为原始数组调⽤函数处理后的值。
2.map⽅法不会对空数组进⾏检测,map⽅法不会改变原始数组。
3.浏览器⽀持:chrome、Safari1.5+、opera都⽀持,IE9+,array.map(function(item,index,arr){},thisValue)var arr = [0,2,4,6,8];var str = arr.map(function(item,index,arr){console.log(this); //windowconsole.log("原数组arr:",arr); //注意这⾥执⾏5次return item/2;},this);console.log(str);//[0,1,2,3,4]若arr为空数组,则map⽅法返回的也是⼀个空数组。
【C语言】while与for执行效率的比较
0040D794 jle whileTest+41h (0040d7a1)
23: {
24: sum = sum + num;
0040D796 mov edx,dword ptr [ebp-8]
0040D799 add edx,dword ptr [ebp-4]
0040D7A5 push offset string "whileTest:%d\n" (00422fac)
0040D7AA call printf (0040d6e0)
0040D7AF add esp,8
28: }
0040D7B2 pop edi
0040D7B3 pop esi
0040D7B4 pop ebx
0040D408:迭代次数总共1条指令
0040D40F:保存加法结果总共1条指令
0040D416~0040D439: for循环总共12条指令
0040D43B~0040D449:打印结果总共5条指令
0040D44C~0040D45C:恢复栈现场总共9条指令
合计: 38条指令
程序中二个方法语句区别在于一个是for循环,一个是while循环.
15: }
0040D44C pop edi
0040D44D pop esi
0040D44E pop ebx
0040D44F add esp,4Ch
0040D452 cmp ebp,esp
0040D454 call __chkesp (0040d6a0)
0040D459 mov esp,ebp
0040D45B pop ebp
{
sum = sum +ileTest:%d\n",sum);
【Java语言】while与for执行效率对比
【Java语言】while与for执行效率对比/blog/1005821测试环境(虚拟机版本): sun jdk build 1.6.0_22-b04测试程序Java代码1./**2. * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)3. * All rights reserved.4. * Author: Jarg Yee <yeshaoting@>5. * /6. */7. import java.util.*;8./*9. * 【Java语言】while,for执行效率对比10. */11.public class WhileFor12.{13. public static void main(String[] args)14. {15. System.out.println(whileTest());16. System.out.println(forTest());17.18. }19.20. /** while测试 */21. public static long whileTest()22. {23. int num = Integer.MAX_VALUE; // 迭代次数24. long sum = 0; // 保存加法结果25.26. while((num--)>0)27. {28. sum = sum + num;29. }30.31. return sum;32. }33.34. /** for测试 */35. public static long forTest()36. {37. int num=Integer.MAX_VALUE; // 迭代次数38. long sum = 0; // 保存加法结果39.40. for(;(num--)>0;)41. {42. sum = sum + num;43. }44.45. return sum;46. }47.}class文件反编译指令---------- Java反编译----------Class文件反编译指令代码piled from "WhileFor.java"2.public class WhileFor extends ng.Object{3.public WhileFor();4. Code:5. 0: aload_06. 1: invokespecial #1; //Method java/lang/Object."<init>":()V7. 4: return8.9. LineNumberTable:10. line 11: 011.12.13.14.public static void main(ng.String[]);15. Code:16. 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;17. 3: invokestatic #3; //Method whileTest:()J18. 6: invokevirtual #4; //Method java/io/PrintStream.println:(J)V19. 9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;20. 12: invokestatic #5; //Method forTest:()J21. 15: invokevirtual #4; //Method java/io/PrintStream.println:(J)V22. 18: return23.24. LineNumberTable:25. line 15: 026. line 16: 927. line 18: 1828.29.30.31.public static long whileTest();32. Code:33. 0: ldc #6; //int 214748364734. 2: istore_035. 3: lconst_036. 4: lstore_137. 5: iload_038. 6: iinc 0, -139. 9: ifle 2040. 12: lload_141. 13: iload_042. 14: i2l43. 15: ladd44. 16: lstore_145. 17: goto 546. 20: lload_147. 21: lreturn48.49. LineNumberTable:50. line 23: 051. line 24: 352. line 26: 553. line 28: 1254. line 31: 2055.56.57.58.public static long forTest();59. Code:60. 0: ldc #6; //int 214748364761. 2: istore_062. 3: lconst_063. 4: lstore_164. 5: iload_065. 6: iinc 0, -166. 9: ifle 2067. 12: lload_168. 13: iload_069. 14: i2l70. 15: ladd71. 16: lstore_172. 17: goto 573. 20: lload_174. 21: lreturn75.76. LineNumberTable:77. line 37: 078. line 38: 379. line 40: 580. line 42: 1281. line 45: 2082.83.84.85.}输出完成(耗时0 秒) - 正常终止二个函数forTest(),whileTest()分别用于测试for,while性能.二个函数体都包括迭代次数,保存加法结果,算术求和,返回值四条相同语句,只有循环语句不同.forTest()中用的for循环,whileTest()中的while循环.细数forTest()方法,whileTest()方法反编译后所有的指令数,发现:二者用去的指令数是一样多,都是21条.由此可知,在Java语言,for,while循环的性能是一样的.这与大家知道的C语言while循环比for循环执行效率高相悖.其实,C语言中while循环也并不是千遍一律的比for循环执行效率高.C语言中,while,for执行效率对比将在下一篇文章通过查看汇编指令指出.。
c语言for循环用法
c语言for循环用法
C语言的for循环是一种常用的循环结构,它可以简化代码,提高效率。
for循环的语法如下:
for (初始化表达式; 条件表达式; 更新表达式)
{
循环体语句;
}
其中,初始化表达式只在循环开始时执行一次,用于初始化循环控制变量;条件表达式在每次循环开始前都会被计算,如果结果为true,则继续循环;更新表达式在每次循环结束后都会被执行,用于更新循环控制变量;循环体语句是需要重复执行的语句块。
for循环可以用于循环遍历数组,例如:
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++)
{
printf('%d ', arr[i]);
}
也可以用于实现循环计数器的功能,例如:
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
printf('1加到100的和为%d
', sum);
此外,for循环也可以嵌套使用,用于处理多层循环的问题,例如:
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
{
printf('*');
}
printf('
');
}
for循环的使用可以大大简化代码,提高程序效率,但需要注意循环控制变量的初始化、更新和边界条件的设置,以免出现意外错误。
for、while循环和if条件
for、while循环和if条件题目:探究for、while循环和if条件的应用场景和效率导言:计算机编程领域中,for循环、while循环和if条件是最常用的控制结构。
它们在实现不同的功能时发挥着重要作用。
本文将从应用场景和效率两个方面,一步一步地探讨这三者的使用方法和优劣之处。
第一部分:for循环for循环是一种控制流结构,指定重复执行一段代码的次数,它的语法结构为:for(初始化; 循环条件; 迭代器){ 执行的代码块}。
for循环通常用于已知循环次数的情况下,如遍历数组、集合等。
其应用场景包括但不限于以下几个方面:1. 数组遍历:通过for循环可以轻松遍历数组中的每一个元素,进行相关操作,如对数组元素求和、查找特定元素等。
2. 文件读写:通过循环的方式可以不断读取和写入文件中的数据,实现批量处理数据的功能。
3. 排序算法:如冒泡排序、选择排序等,通过嵌套的for循环可以实现对数组或集合数据的排序。
对于for循环的效率,它由初始化、循环条件判断和迭代构成。
因此,当循环次数确定时,for循环的效率相对较高。
然而,在循环次数不确定或需要根据一些条件动态决定时,for循环并不适用。
第二部分:while循环while循环是一种在给定条件为真的情况下重复执行代码块的控制结构,其语法结构为:while(循环条件){ 执行的代码块}。
while循环适用于循环次数不确定的情况,它的应用场景包括但不限于以下几个方面:1. 用户输入验证:通过while循环可以实现对用户输入的验证,循环直到用户提供有效输入为止。
2. 事件监听:通过while循环可以不断监听某个事件的发生,一旦满足特定条件,则执行相关操作。
3. 数据处理:当数据的长度不确定时,可以利用while循环对数据进行处理,直到满足特定条件。
相较于for循环,while循环的优势在于它可以适应较为复杂的逻辑条件,循环次数可以根据实际需要灵活地进行调整。
然而,如果循环条件设置不当,可能会导致无限循环。
一起谈.NET技术,三种For循环写法的性能比较
⼀起谈.NET技术,三种For循环写法的性能⽐较 循环作为程序语⾔的三⼤逻辑控制结构之⼀,在实际开发是经常会遇到的。
在JavaScript程序的循环结构使⽤上,我们经常会遇到这种应⽤。
根据⼀个对象的长度进⾏循环并对对象每个每个元素进⾏处理。
如for(var i=0;i<a.length;i++){sum+=a[i]}以上只是⼀个简单的⽰例,对于如上程序,很多程序开发者都研究过关于其执⾏效率的问题。
因此就出现了以下的两种写法:for(var i=0,iLen=a.length;i<iLen;i++){sum+=a[i]}for(var i=0,item;item=a[i];i++){sum+=item;}或for(var i=0,item;(item=a[i])!=undefined;i++){sum+=item;}对于三种写法其性能到底有多⼤差异呢?到底哪个的效率更⾼呢?我在⾃⼰的机器上对其做了测试:发现在10000条数据以下时三者执⾏速度差别不⼤,差别⼤概在0.01m左右,⽽且测试结果不稳定。
然后将数据变为50w条进⾏测试:三种⽅法测试结果分别为: 1182 981 1673(⽽且出现“程序执⾏缓慢,是否取消该脚本”的提⽰) 1572 1462 12067(同样出现了脚本加载缓慢的提⽰) 尽管数据并不是⾮常稳定,但还是能从中发现点什么的。
速度最快的是第⼆种写法:即保存对象长度,避免每次都计算。
速度最慢的是第三种写法:即不关系对象的长度,⽽根据当前项是否存在来循环。
之前我⼀直以为是第三种写法速度应该是最快的(因为不⽤计算长度),今⽇⼀测才发现第三种的执⾏效率如此低下,看来还是避免使⽤。
当然,很多时候我们可能还是不得不使⽤这第三种写法。
测试程序如下:(建议分开对三个程序进⾏测试,特别是在FF下)<script type="text/javascript"><!--var a=[];for(var i=0;i<500000;i++){a.push(100);}var sum=0;var timer1=new Date().getTime();for(var i=0;i<a.length;i++){sum+=a[i];}alert(sum+"\ntime:"+(new Date().getTime()-timer1));sum=0;var timer2=new Date().getTime();for(var i=0,iLen=a.length;i<iLen;i++){sum+=a[i];}alert(sum+"\ntime:"+(new Date().getTime()-timer2));sum=0;var timer3=new Date().getTime();for(var i=0,item;item=a[i];i++){sum+=item;}alert(sum+"\ntime:"+(new Date().getTime()-timer3));//--></script>。
多线程如何解决for循环效率的问题
多线程如何解决for循环效率的问题多线程解决for循环效率问题在for⾥⾯,如果执⾏⼀次for⾥⾯的内容所需时间⽐较长,可以使⽤线程池来提⾼for循环的效率public class TreadFor {private static final int loopNum = 1*10;public static void main(String args[]) throws InterruptedException {TreadFor TestThreadPool = new TreadFor();long bt = System.currentTimeMillis();List<String> list = new ArrayList<>();list.add("0");list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");list.add("7");list.add("8");list.add("9");TestThreadPool.m1(list);long et2 = System.currentTimeMillis();System.out.println("[1]耗时:"+(et2 - bt)+ "ms");Thread thread = new Thread();long at = System.currentTimeMillis();TestThreadPool.m2();long et3 = System.currentTimeMillis();System.out.println("[2]耗时:"+(et3 - at)+ "ms");}public void m1( List<String> list) {ExecutorService pool = Executors.newCachedThreadPool();for (int i = 0; i < list.size(); i++) {String str = list.get(i);System.out.println(list.get(i));Runnable run = new Runnable() {public void run() {try {new Thread().sleep(1000);//模拟耗时操作System.out.println("[1]" + Thread.currentThread().getName()+"----"+str);} catch (Exception e) {}}};pool.execute(run);}System.out.println("[1] done!");pool.shutdown();}public void m2() {AtomicInteger connectionIds = new AtomicInteger(0);for (int index = 0; index < loopNum; index++) {try {new Thread().sleep(1000); //模拟耗时操作System.out.println("[2]" + Thread.currentThread().getName());} catch (Exception e) {e.printStackTrace();}}System.out.println("[2] done!");}}其中遍历list,给⽅法传参,参数最终也可以进⼊的线程⾥;运⾏结果:由打印结果可知:m1⽅法是⽤到了多线程的,多线程此时被线程池管理;⽽m2⽅法始终是main主线程执⾏的。
while和for死循环效率比较
while和for死循环效率⽐较while(1) 和 for( ; ; ) 的效率⽐较最近在学习线程池,然后看到⼤佬写的线程池代码⽤的for( ; ; )死循环,虽然可以这样⽤,但是毕竟没有while(1)这个更直观,所以我查了下资料:⽤while构造死循环时,⼀般会使⽤while(TRUE)来构造死循环;⽽⽤for来构造死循环时,则使⽤for(;;)来构造死循环。
这两个死循环的区别是:while循环⾥的条件被看成表达式,因此,当⽤while构造死循环时,⾥⾯的TRUE实际上被看成永远为真的表达式,这种情况容易产⽣混淆,有些⼯具软件如PC-Lint就会认为出错了,因此构造死循环时,最好使⽤for(;;)来进⾏。
⼜看到for(;;)和while(1)在早期的编译器上是有区别的,for要⽐while少⼀句判断.⽽在新的编译器上,2者的差别已经没有了,现在的编译器已经能作出很智能的优化了.下⾯是⽤BCB写的代码的汇编码,可以看出已经没有区别了:有了⼤概的认知,我肯定不能全信,那我肯定要试试,所以我写了下⾯两段代码,分别在linux和windows下反编译while(1)循环#include <stdio.h>int main(){while(1){printf("while ..\n");sleep(1000);}}反编译vc2019,ISO C++14 环境00007FF6ED551074 lea rcx, [string "for ..\n" (07FF6ED552240h)]00007FF6ED55107B call printf(07FF6ED551010h)00007FF6ED551080 mov ecx, 3E8h00007FF6ED551085 call qword ptr[__imp_Sleep(07FF6ED552000h)]00007FF6ED55108B jmp main + 4h(07FF6ED551074h)linux gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)40057d: 55 push % rbp40057e : 48 89 e5 mov % rsp, % rbp400581 : bf 30 06 40 00 mov $0x400630, % edi400586 : e8 c5 fe ff ff callq 400450 < puts@plt >40058b : bf e8 03 00 00 mov $0x3e8, % edi400590 : b8 00 00 00 00 mov $0x0, % eax400595 : e8 e6 fe ff ff callq 400480 < sleep@plt >40059a : eb e5 jmp 400581 < main + 0x4 >40059c : 0f 1f 40 00 nopl 0x0(% rax)for(;;)循环#include <stdio.h>int main(){for(;;){printf("for ..\n");sleep(1000);}}反编译vc2019,ISO C++14 环境00007FF70E401074 lea rcx, [string "while ..\n" (07FF70E402240h)]00007FF70E40107B call printf(07FF70E401010h)00007FF70E401080 mov ecx, 3E8h00007FF70E401085 call qword ptr[__imp_Sleep(07FF70E402000h)]00007FF70E40108B jmp main + 4h(07FF70E401074h)linux gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)40057d: 55 push % rbp40057e : 48 89 e5 mov % rsp, % rbp400581 : bf 30 06 40 00 mov $0x400630, % edi400586 : e8 c5 fe ff ff callq 400450 < puts@plt >40058b : bf e8 03 00 00 mov $0x3e8, % edi400590 : b8 00 00 00 00 mov $0x0, % eax400595 : e8 e6 fe ff ff callq 400480 < sleep@plt >40059a : eb e5 jmp 400581 < main + 0x4 >40059c : 0f 1f 40 00 nopl 0x0(% rax)能看到,除了打印的消息不⼀样,都是⽆条件jmp指令,得出结论,新版编译器不需要在乎for(;;)和while(1)循环的效率问题,编译器已经帮我们处理了。
for循环与for-each循环
for循环与for-each循环
©奈须蘑菇来⾃简书同步转载!
关于for循环,他的作⽤对象⽐较⼴,他的基本形式是这样的:
for(表达式1,判断条件,表达式2){ 循环体; }
他的程序执⾏顺序是:
开始----->表达式1------>执⾏循环体------->表达式2-------->条件---------->表达式1----->(继续循环之前爱的过程)
关于for-each循环⽐较特殊,他只能⽤于遍历数组和集合。
for-each(类型变量 in数组or集合){ 循环体;}
他的程序执⾏顺序是:数组&集合(依次抽出每⼀个数据)------>变量------>循环体-------->数组&集合------->(循环)
for循环的优点,就是全部都可以循环,缺点就是他的效率较慢,速度⽐较慢。
for-each循环的优点就是效率⾼,速度快,但是缺点就是只能进⾏循环数组和集合。
js中for循环和indexOf()性能对比
js中for循环和indexOf()性能对⽐1、js 中for循环和indexOf()性能对⽐在js中提供了indexOf()函数以获取某个字符在字符串中的index,可以通过它也判断某个字符或字符串是否存在。
但同时在js中for循环也可以实现同样的效果(判断字符是否存在)。
那么到底⽤哪个才好呢?于是写了两个函数来⽐较:function getValue() {var str = "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghija var specialWord = new Array("'", "\\", "<", ">", "%", "?", "/", "+", "@", "&", "#", "$", "……", "^", "~", "!", "‘", "’", "!", "¥"); //可以继续添加特殊字符此 / 字符也不可输⼊输出时会破坏JSON格式for (var specialWordItem = 0; specialWordItem < specialWord.length; specialWordItem++) {ar specialIndex = str.indexOf(specialWord[specialWordItem]);if (specialIndex != (-1)) {return false;}}return true;}function getReValue() {var str = "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghija var specialWord = new Array("'", "\\", "<", ">", "%", "?", "/", "+", "@", "&", "#", "$", "……", "^", "~", "!", "‘", "’", "!", "¥"); //可以继续添加特殊字符此 / 字符也不可输⼊输出时会破坏JSON格式for (var specialWordItem = 0; specialWordItem < specialWord.length; specialWordItem++) {for (var j = 0; j < str.length; j++) {if (specialWord[specialWordItem] == str.charAt(j)) {return false;}}}return true;}unction bothFunction() {getValue();getReValue();}str字符串是1000个字符。
python常用的数据结构运行效率分析
python常⽤的数据结构运⾏效率分析1.while循环和for循环相同条件下的运⾏效率⽐较:如下代码:1import time as tm2import timeit as tt3import random as rm45def while_time():6 i = 07while i < 100000001:8 i += 19if i > 100000:10break11return i121314def for_time():15 j = 016for i in range(100000001):17 j += 118if j > 100000:19break20return j2122if__name__ == "__main__":23 t1 = tt.Timer("for_time()", "from __main__ import for_time")24print(t1.timeit(number=10))25 t2 = tt.Timer("while_time()", "from __main__ import while_time")26print(t2.timeit(number=10))结果:说明:如上结果,for循环和while循环的时间复杂度都是T(n)=5*n+1,但是for循环的效率⽐while循环稍⾼。
2.遍历列表、元组、集合的效率⽐较:如下代码:1def list_time():2for i in list1:3 i += 1456def tuple_time():7for i in tp1:8 i += 191011def set_time():12for i in set1:13 i += 11415def main():16 list1 = list(range(30000000))17 tp1 = tuple(list1)18 set1 = set(list1)19 t1 = tt.Timer("list_time()", "from __main__ import list_time")20print(t1.timeit(number=10))21 t2 = tt.Timer("tuple_time()", "from __main__ import tuple_time")22print(t2.timeit(number=10))23 t3 = tt.Timer("set_time()", "from __main__ import set_time")24print(t3.timeit(number=10))25if__name__ == "__main__":26 main()结果:说明:三个函数的查找的时间复杂度都为O(n),列表和元组的遍历效率差不多,集合遍历的效率稍低。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for each (var xml:XML in xmlData.item)
{
trace("循环===" + xml); //取xml的值
}
trace("test for in--------------------");
//test for in
for (var xml1:String in xmlData.item)
{
trace("循环===" + xml1 + "____" + xmlData.item[xml1]); //取xml的值
}
//trace结果
Object的情况,for … in 平均560毫秒,for each … in 平均8毫秒。
var testObj:Object = new Object();
for(var i:Number = 0; i < 100000; i++)
{
testObj[i] = i + 1;
</item>
循环===<item>
<ID>4</ID>
<NAME>Node4</NAME>
<LOCLAYER>4</LOCLAYER>
</item>
循环===<item>
<ID>5</ID>
<NAME>Node5</NAME>
<ID>5</ID>
<NAME>Node5</NAME>
<LOCLAYER>5</LOCLAYER>
</item>
***/
}
]]>
</fx:Script>
<s:VGroup width="100%"
horizontalAlign="center">
</item>
循环===1____<item>
<ID>2</ID>
<NAME>Node2</NAME>
<LOCLAYER>2</LOCLAYER>
</item>
循环===2____<item>
<ID>3</ID>
<NAME>Node3</NAME>
//for 260毫秒
var len:Number = testArr.length;
for(var j:Number = 0; j < len; j++)
{
testArr[j]++;
}
//for ... in 8000毫秒
for(var k:String in testArr)
</item>
</items>;
protected function btn_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
//test for each in
<ID>4</ID>
<NAME>Node4</NAME>
<LOCLAYER>4</LOCLAYER>
</item>
<item>
<ID>5</ID>
<NAME>Node5</NAME>
<LOCLAYER>5</LOCLAYER>
<LOCLAYER>5</LOCLAYER>
</item>
test for in--------------------
循环===0____<item>
<ID>1</ID>
<NAME>Node1</NAME>
<LOCLAYER>1</LOCLAYER>
/**
* test test for each in--------------------
循环===<item>
<ID>1</ID>
<NAME>Node1</NAME>
<LOCLAYER>1</LOCLAYER>
</item>
循环===<item>
}
/*输出
键:key1 值:value1
键:key2 值:value2
键:key3 值:value3
*/
for each(var k in obj){
trace("值:"+k);
}
/*输出
值:value1
值:value2
值:value3
*/
可以看出,for……in和for each……in的区别在于,for……in的枚举变量代表的是键,必须要通过数据访问符[]加上这个键值,才能访问到集合成员。而for each……in的枚举变量k则直接代表集合的成员。也就是说,当程序需要使用键的信息时,用for……in;只需要访问集合成员时,使用for each……in最方便。在实践中,for each……in使用比for……in多一些。大部分情况下,我们并不需要知道成员的名字(键)。
<LOCLAYER>3</LOCLAYER>
</item>
循环===3____<item>
<ID>4</ID>
<NAME>Node4</NAME>
<LOCLAYER>4</LOCLAYER>
</item>
循环===4____<item>
}
//for ... in 读取标签 560毫秒
for(var j:String in testObj)
{
testObj[j]++;
}
//for each ... in 直接读值 8毫秒
for each(var k:Number in testObj)
{
k++;
}
for……in和for each……in
var obj:Object={
key1:"value1",
key2:"value2",
key3:"value3"};
for(var k in obj){
trace("键:"+k+"\t值:"+obj[k]);
<s:Button id="btn"
label="点击"
click="btn_clickHandler(event)"/>
</s:VGrt;
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="/mxml/2009"
xmlns:s="library:///flex/spark"
xmlns:mx="library:///flex/mx"
{
testArr[k]++;
}
//for each ... in 58毫秒
for each (var m:Number in testArr)
{
m++;
}
效率如何呢?经过多次测试,for 循环平均260毫秒(不预存数组长度平均400毫秒),for … in 循环平均8000毫秒,for each … in 循环58毫秒!!所以应该尽量避免 for … in ,多用 for each … in ,用for循环的话最好预存数组长度(var len:Number = testArr.length;)。
<ID>2</ID>
<NAME>Node2</NAME>
<LOCLAYER>2</LOCLAYER>
</item>
循环===<item>
<ID>3</ID>
<NAME>Node3</NAME>
<LOCLAYER>3</LOCLAYER>
<item>
<ID>1</ID>
<NAME>Node1</NAME>