一,概述

1)代码调优的目的是什么?

减少CPU运行时间;减少分页或增加高速缓存命中率;减少程序所需空间

2)代码调优为什么不能“滥用”?

1>效率的角色:不成熟的优化是大量编程灾害的根源,可能危及程序正确性、功能及可维护性。

2>度量工具:利用性能检测工具,找到“热点”代码,即程序关键区域,然后优化。

3>设计层面:效率问题可以从多个方面进行解决(算法和数据结构、数据结构重组、硬件升级),只有没有更好的解决方案才进行代码优化。

4>双刃剑:有些优化在特定程序中可以提速,但在另外程序中有可能急剧减速。

3)急救方案集锦

1>整数取模(取模运算时间大于加减法执行时间)

k=k%n;

可以替换为

if(k>=n)  k=k-n;

2>函数、宏、和内联代码

内联函数和宏具体参见博客 http://blog.csdn.net/tianshuai11/article/details/7569659

3>顺序搜索

采用“哨兵”  让循环体不用 每次都判断边界。从而增加了运行速度

将循环展开,替换自增。

a[100]=50; for(i=0; ; ++i) { if(a[i] == t) break; } if(i == 100) printf("false\n"); else printf("true\n");
替换为 a[100]=50; for(i=0; ; i+=4) { if(a[i] == t) { break; } if(a[i+1] == t) { i+=1; break; } if(a[i+2] == t) { i+=2; break; } if(a[i+3] == t) { i+=3; break; } if(a[i+4] == t) { i+=4; break; } } if(i == 100) printf("false\n"); else printf("true\n");
              4>计算球面距离

4)大手术---二分搜索

#include "stdio.h" #include<windows.h> int main() { int i; int t=500;//要查找的数 int a[1000]; //初始化数组 for(i=0;i<1000;++i) a[i]=i; a[1000]=50;//哨兵 i=512; int l=-1; if(a[511]<t) l=1000 -512; while(i!=1) { i=i/2; if(a[l+i] < t) l = l+i; } int p=l+1; if(p> 1000 || a[p] != t) { p=-1; printf("false\n"); } else { printf("位置为:%d\n",p); printf("true\n"); } }

二,习题

3)while 语句的开销 大于 if语句

4)宏 不适合用于递归函数中

5)不排序 进行二分查找,如果找到则肯定存在。找不到也不一定 不存在。

6) isdigit(char c) {if(c>='0' && c<='9'}

例子

#include <stdio.h> #include <ctype.h> #define in_area(x, a, b) ((x)>=(a) && (x)<=(b)) #define isxdigit(x) (isdigit(x) || in_area(x, 'a', 'f') || in_area(x, 'A', 'F') ) void print( int boolean ) { printf( "%s\n", boolean ? "true" : "false" ); } int main(int argc, char *argv[]) { // for testing .... print(isxdigit('0')); print(isxdigit('9')); print(isxdigit('5')); print(isxdigit('A')); print(isxdigit('F')); print(isxdigit('a')); print(isxdigit('f')); print(isxdigit('z')); print(isxdigit('M')); print(isxdigit('L')); return 0; }           7)给定一个非常长的字节序列(假设有十亿或万亿),如何高效的统计1的个数

题意:快速计算整数的二进制表示法中1的个数

分析:转换为二进制然后一个一个求,是不现实的做法。蛮干不是我们想要的结果。

方法一:(算法的时间复杂度就是1的个数)

//& 按位与 只要两个相同位同时为 1 则该位为 1 //7&5 0111 & 0101 = 0101 (5) int OneCount(unsigned int x) { int count; for(count=0; x>0; count++) x&=x-1;//把最后面的1变0 return count; }

方法二:

const int idx[256]={0,1,1,……,8}//0~255中含1的个数 int OneCount(unsigned int x) { int count=0; for(; x>0; x>>=8) count+=idx[x&255]; return count; }

8)在程序中如何使用哨兵找出数组中的最大元素

#include "stdio.h" int main() { int i; int max; int a[100]; for(i=0;i<100;++i) a[i]=i; i=0; while(i<100) { max=a[i]; a[100]=max; ++i; while(a[i]<max)//直到找到比刚才的大的元素 i++; } printf("%d\n",max); return 0; }

转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/15/2509992.html

【编程珠玑】第九章 代码调优相关推荐

  1. 编程珠玑第九章——习题

    习题7 给定一个非常长的字节序列(假设有十亿或万亿),如何高效的统计1的个数 方法一:(算法的时间复杂度就是1的个数) [html] view plaincopy //& 按位与 只要两个相同 ...

  2. 【原创】构建高性能ASP.NET站点 第五章—性能调优综述(后篇)

    构建高性能ASP.NET站点 第五章-性能调优综述(后篇) 前言:本篇主要讲述如何根据一些简单的工具和简单的现象来粗布的定位站点的性能问题. 本章的议题如下: 性能调优的一般过程 利用分析工具分析页面 ...

  3. 建高性能ASP.NET站点 第五章—性能调优综述(中篇)

    构建高性能ASP.NET站点 第五章-性能调优综述(中篇) 前言:本篇主要讲述用一些简单的工具来分析一些与站点性能有关的数据,在上一篇文章中,我们讨论了一下性能调优的一般过程,本篇就开始介绍一些方法和 ...

  4. 转:构建高性能ASP.NET站点 第五章—性能调优综述(中篇)

    构建高性能ASP.NET站点 第五章-性能调优综述(中篇) 前言:本篇主要讲述用一些简单的工具来分析一些与站点性能有关的数据,在上一篇文章中,我们讨论了一下性能调优的一般过程,本篇就开始介绍一些方法和 ...

  5. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  6. Go代码调优利器-火焰图

    转自: https://lihaoquan.me/2017/1/1/Profiling-and-Optimizing-Go-using-go-torch.html Go代码调优利器-火焰图 go 调优 ...

  7. 编程珠玑第二章习题答案

    转载自互联网,并做了修改 1.提供单词和词典,找到该单词的所有变位词,可以事先花时间和空间处理下该词典. 为了找出给定单词的所有变位词,首先是计算给定单词的标识.如果不允许预处理,只能够顺序读取文件, ...

  8. Python Qt GUI快速编程第六章代码分析

    这是我敲的Python Qt Gui快速编程第六章上的代码,以后可能要用到其中一些,如果忘记了就来这里看看. #coding=utf-8 #d import os import platform im ...

  9. Mysql高级调优篇——第一章:调优必备索引知识

    1.Sql预热 常见的七种Join理论,看图就非常清晰 左连接:A独有+在A中的B部分 select * from A left join B on A.key = B.key 因为没有满足A的B,所 ...

最新文章

  1. 厚积薄发!他读博前三年零文章,后期发力产出11篇一作,现任985高校博导
  2. 安装tensorflow-gpu==1.13.1成功案例
  3. Bitmap的使用(三)
  4. 详解Linux2.6内核中基于platform机制的驱动模型 (经典)
  5. Linux命令行抓包及包解析工具tshark(wireshark)使用实例解析
  6. 《图数据库(第2版)》——2.1 关系型数据库缺少联系
  7. 华为回应“发射卫星抢占6G”:假消息
  8. MariaDB-5.5.56 主主复制+keepalived高可用
  9. nginx return知多少
  10. C++统计博客园写过的代码行数
  11. c#参数修饰符-ref
  12. Centos Python安装graphviz和pydotplus
  13. Openstack 网络模块
  14. GAN: Generative Adversarial Nets
  15. 11月13日科技资讯|天猫回应“双11数据造假”:已启动司法流程;小米折叠手机专利曝光;ASP.NET感染勒索软件|极客头条
  16. Android 文件管理器 文件缩略图标显示流程
  17. bearer token_接口认证方式:Bearer Token
  18. 使用 GOLANG 发送邮件
  19. 猎人抓兔子 - (广度优先算法)
  20. 有关是否携带首部的随笔

热门文章

  1. [代码]--GridControl使用技巧总结,更新中...
  2. 关于ASP.NET与CLR相互关系的一些总结
  3. [Vue warn]: Cannot find element: #main
  4. python读取xml文件
  5. jQuery之.queue()
  6. ASIHTTPRequest类库简介
  7. Linux逻辑卷(LVM)技术详解
  8. Django 的第三方包
  9. python笔记03_IO编程
  10. 使命召唤16计算机内存不足,使命召唤16出现一个问题怎么解决