【程序语言】程序循环的那些事儿

2024-03-29 00:18

本文主要是介绍【程序语言】程序循环的那些事儿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   我一直认为循环是程序的发动机,所以决定深入探究一下循环的那些事儿!

   下面我们研究一下循环的写法和效率:

   背景是这假设有一个存放20个元素的数组int arr[20],我们想对它进行求和,也就arr[0]+arr[1]+…… 好的,在这个简单的背景下,我们开始我们的探索吧!

 

  1.第一个富有建设性的版本诞生了,她是那么的直观,那么的整洁,嘻嘻:   

     int sum = 0;
sum =  arr[0]  +arr[1]  +arr[2]  +arr[3]
+arr[4]  +arr[5]  +arr[6]  +arr[7]
+arr[8]  +arr[9]  +arr[10] +arr[11]
+arr[12] +arr[13] +arr[14] +arr[15]
+arr[16] +arr[17] +arr[18] +arr[19]; 

     也许你觉得最初级的程序员都不会写出这样的代码的,但请不要鄙视这种写法!真的,也许某一天你会喜欢上这个版本的!

  2.第二个版本是百分之80的程序员都会这么写的一种最普通的写法:

     int sum=0;
for(int i=0; i<20; i++)
{    sum += arr[j];    }

 这个版本是不是忒熟悉,忒顺眼,忒良好,忒精简。嘿嘿,也忒普通!

  3.第三个版本来自第二个版本的改良。什么?第二个还可以改良,骗人吧!没骗你:   

    int sum=0;
for(int i=0; i<20; ++i)
{    sum += arr[i];    }

     神啊,请问这也叫改良吗?几乎没动过嘛!错,i++改成了++i。这也叫改良吗? 当然算改良,要不,你自己测测效率就知道了。

 

  4.第四个版本来自C++版本的指针,其他语言不用担心,其实语言编译器也用指针的,嘿嘿。

     int sum=0;
for(int i=0; i<20; ++i)
{   sum += *(arr+i);  }

     用指针有什么好的?因为 arr[i] 会被翻译成 *( arr + i*sizeof(int) ) ,有差别吗?当然有啦。但是这是在古老的编译器中,现代流行的编译器中,其实有优化过了,arr[i]和*    (arr+i)基本没区别了!

 

   5.最后的一个版本来自元编程(metaprogramming),编译型语言在理论上支持元编程。现在貌似Ruby也支持元编程,但这里还是以C++为例子好了,大家熟悉点儿嘛。

     template <int Dim,typename T>
struct Sum{
static T sum(T *arr){
return (*arr) + Sum<Dim-1,T>::sum(arr+1);
};
};
template<typename T>
struct Sum<1,T>{
static T sum(T *arr){
return *arr;
};
};
int sum = Sum<20,int>::sum(arr);

 你骗人这算什么熟悉!!!呵呵,有不熟悉,才有熟悉嘛!这是一种挖掘编译器潜力的编程方法,是一种用来生成代码的编程方式。例如这个版本的求和,你不要以为她调用了任何函数,其实她和第一个版本是一摸一样的,编译器会自动将代码展开到第一个版本的形式。

    现在,是时候看看这五个版本的循环有什么区别了。为保证公平,我对每段代码都循环执行1,000,000,000次,下面就是我们期待良久的结果了:

                   第一次     第二次     第三次    第四次

      版本1:0              0              0            0

      版本2:8290        8180        8200      8250

      版本3:8090        8160        8070      8234

      版本4:8252        8140        8050      8460

      版本5:10            0              0            0

   嘻嘻,看结果什么感觉,说过不要轻视第一个版本吧,你真有可能什么时候需要她呢!i++和++i还是有区别的哦!至少我测试了很多次,一直都是++i快那么一点儿,虽然不多。第5个元编程版本什么感受呢?

 

 结论:

   1.不要轻视那些最直观的傻瓜式编程,或许计算机本身最擅长的就是这个!

   2.i++和++i还是有区别的,有兴趣可以看看左值和右值的区别,另外i++和i++还涉及到一个中间变量问题。

   3.在现代C++中还是少使用指针运算了。多态和智能指针sharedptr除外!

   4.元编程是生成代码的编程,可能在需要极致效率的时候,而程序中存在常量的时候,元编程是个选择。

 

说明一下“开发效率”和“执行效率”的均衡:

   1.一个程序员 一年的 工资 按中国的平均年薪算 6W.

   2.一台服务器按一般的配置算1W

现在需要写一个程序:假设有两个实现版本,四家公司用。

   1.X版本注重开发效率,需要    2  个月 5   人团队完成.

   2.Y版本注重执行效率,需要 10  个月 25 人团队完成.

   3.A公司是一家小公司,需要程序运行在    2              台服务器上,服务于2,000               人左右.

   4.B公司是一家小公司,需要程序运行在   10             台服务器上,服务于10,000             人左右.

   5.C公司是一家大公司,需要程序运行在   10,000      台服务器上,服务于10,000,000      人左右.

   6.D公司是一家大公司,需要程序运行在   1,000,000 台服务器上,服务于1,000,000,000 人左右.

其实,对程序成本进行简略计算,程序员加管理成本,简单计算为12W每年每人。X版本程序成本10W,

Y版本程序成本250W。假设 Y 比 X 效率高 5%, 那么就会节省 5%的服务器,

   1.对 A 公司而言,节省了 0.1       台服务器,如果使用 Y 版本,亏损    239.9W.

   2.对 B 公司而言,节省了 0.5       台服务器,如果使用 Y 版本,亏损    239.5W.

   3.对 C 公司而言,节省了 500      台服务器,如果使用 Y 版本,净赚    260.0W.

   4.对 D 公司而言,节省了 10,000 台服务器,如果使用 Y 版本,净赚 9,760.0W.

这就是一种衡量,小公司要的是开发效率,恨不得所有东西都可以用Ruby写,大公司要的是效率,恨不得

“所有程序都可以用汇编写!”. 

 

这篇关于【程序语言】程序循环的那些事儿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857096

相关文章

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意