showMem.c setMem.c 及其改进
#ifndef MEMUTIL_H_INCLUDED
#define MEMUTIL_H_INCLUDED // Show memory
void showMem(void *, unsigned); // Setup memory
int setMem(void *, const char *); #endif // MEMUTIL_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // Display memory
void showMem(void *p, unsigned size)
{
char *buf = 0;
int prs = 0;
unsigned i; buf = (char *)malloc(size * 9);
printf("Show %p, count %u bits.\n", p, size * 8);
for (i = 0; i < size; i++)
{
char ch = ((char *)p)[i]; // Get char p[i]
int j; for (j = 0; j < 8; j++) // p[i] to 8 bit unsigned int
{
unsigned tmp = 0; tmp = ch >> (8 - j - 1) & 1;
sprintf(&buf[prs], "%u", tmp % 2);
prs = strlen(buf);
}
sprintf(&buf[prs], " ");
prs++;
}
buf[prs - 1] = '\0';
puts(buf);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h> #include "MemUtil.h" // Setup memory
// Return:
// 0 -Setting succeed
// !0 -Setting failed
int setMem(void *p, const char *c)
{
int le;
char *str = 0; // 去除空格的副本
int i;
int j;
char ch; le = strlen(c);
i = le - 1;
str = (char *)malloc(le * 8 / 9 + 2);
str[0] = '\0'; // 去除空格
i = 0;
while ((ch = *(char *)c++) != '\0')
{
if (ch == ' ')
continue;
if (ch == '1' || ch == '0')
{
str[i++] = ch;
str[i] = '\0';
} else {
printf("错误, 未知的字符: %c.", ch);
return !0;
}
}
if ((le = strlen(str)) % 8 != 0)
{
printf("拒绝执行, 长度错误: %d.\n", le % 8);
return !0;
} i = 0;
j = le / 8;
for (; i < j; i++)
{
char tmp = 0;
int k = 0; for (; k < 8; k++)
{
tmp |= (str[i * 8 + k] ^ 0x30) << (7 - k);
}
((char *)p)[i] = tmp;
}
return 0;
}
上面这些代码看似可以工作, 然而!!!!!!!!!!!
就在某一天我准备使用它打造一个二进制文件工具的时候, 发生了爆炸!!!!!!! showMem 处理 200 KB居然耗时 80 s !!!!!!!!!!!!!!!!!!!! 当然其中 puts 占用了绝大部分"功劳", 试着优化一下
#include <stdio.h>
#include <stdlib.h>
#include <string.h> char *showMem(void *p, unsigned size)
{
char *buf = ;
int prs = ;
unsigned i = ;
unsigned j = ;
char ch = '\0';
unsigned tmp = ; if ((buf = (char *)malloc(size * )) == )
{
fprintf(stderr, "Execute failed, PC have not memory.\n");
return ;
} printf("Show %p, count %u bits.\n", p, size * );
for (i = ; i < size; i++)
{
ch = ((char *)p)[i]; // Get char p[i] for (j = ; j < ; j++) // p[i] to 8 bit unsigned int
{
tmp = ch >> ( - j) & ;
buf[prs++] = (tmp == ? 0x30 : 0x31);
}
buf[prs++] = ' ';
}
buf[prs - ] = '\0';
puts(buf);
return buf;
}
showMem.c 性能40+倍提升( -_-! )
#include <stdio.h>
#include <string.h>
#include <stdlib.h> #include "MemUtil.h" // Setting memory
// Return:
// 设置完成的字节数
// -1 代表错误
int setMem(void *p, const char *c)
{
int le = ;
char *str = ; // 去除空格的副本
int i = ;
int j = ;
char ch = ; le = strlen(c);
str = (char *)malloc(le); // 去除空格和换行
while ((ch = *(char *)c++) != '\0')
{
if (ch == ' ' || ch == '\n')
continue;
if (ch == 0x31 || ch == 0x30)
{
str[i++] = ch;
} else {
printf("Oops, dead character %c.", ch);
return -;
}
}
str[i] = '\0'; if ((le = strlen(str)) % != )
{
printf("You setting data is fucking, 错误的余数 %d.\n", le % );
return -;
} i = ;
j = le / ;
for (; i < j; i++)
{
char tmp = ;
int k = ; for (; k < ; k++)
{
tmp |= (str[i * + k] ^ 0x30) << ( - k);
}
((char *)p)[i] = tmp;
}
return j;
}
setMem.c 优化调整
showMem.c setMem.c 及其改进的更多相关文章
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的 ...
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化 如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下: ...
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- jqGrid插件getCol方法的一个改进
jgGrid插件是非常常用的一个基于jQuery的表格插件,功能非常强大.我最近也频繁使用.但是这个插件也有一些不够完善的地方.比如这个getCol方法. getCol方法接受三个参数 colname ...
- kaggle入门2——改进特征
1:改进我们的特征 在上一个任务中,我们完成了我们在Kaggle上一个机器学习比赛的第一个比赛提交泰坦尼克号:灾难中的机器学习. 可是我们提交的分数并不是非常高.有三种主要的方法可以让我们能够提高他: ...
- SQL Server 2016中In-Memory OLTP继CTP3之后的新改进
SQL Server 2016中In-Memory OLTP继CTP3之后的新改进 转译自:https://blogs.msdn.microsoft.com/sqlserverstorageengin ...
- Hadoop学习笔记—21.Hadoop2的改进内容简介
Hadoop2相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要的变更: (1)HDFS的NameNod ...
随机推荐
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- css文本设置
常用的应用文本的css样式: color 设置文字的颜色,如: color:red; font-size 设置文字的大小,如:font-size:12px; font-family 设置文字的字体,如 ...
- python查找字符串所有子串
https://blog.csdn.net/jiangjiang_jian/article/details/79453856 [s[i:i + x + 1] for x in range(len(s) ...
- 20165223《JAVA程序设计》第二周学习总结
20165223 <JAVA程序设计>第二周学习总结 教材学习内容总结 第二章要点 标识符与关键字 基本数据类型 类型转换运算 输入输出数据 数组 第三章要点 运算符与表达式 语句概述 i ...
- Mybatis中org.apache.ibatis.binding.BindingException错误问题总结
1. Mybatis出现多个参数,但是多个参数中没有使用@Param注解进行修饰 2. Xml文件中字段名和PO绑定时候,字段写错了 3.XML中<foreach/>标签中的colleac ...
- Cannot set property 'innerHTML' of null
异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 看如下错误代码: 知道是加载的问题就好解决了
- 【LOJ6284】数列分块8
题目大意:维护一个序列,支持区间染色,查询区间中等于某个颜色的点的个数. 题解:考虑直接用线段树进行维护,维护区间相同颜色值和一个区间颜色是否相同的标记即可. 代码如下 #include <bi ...
- Django(十一)请求生命周期之响应内容(请求/响应 头/体)
https://www.cnblogs.com/renpingsheng/p/7534897.html Django请求生命周期之响应内容 http提交数据的方式有"post",& ...
- Python--多线程、多进程常用概念
一.常用概念 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 线程 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干 ...
- http 请求头和响应头
客户端发送请求过程带着的数据: 1.请求地址 2.请求方式 3.请求头 request headers 4.请求参数 https://www.juhe.cn/ 130.... 1a2b....pei ...