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

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

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失