zoukankan      html  css  js  c++  java
  • 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.
    ", 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] = '';
        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] = '';
    
        // 去除空格
        i = 0;
        while ((ch = *(char *)c++) != '')
        {
            if (ch == ' ')
                continue;
            if (ch == '1' || ch == '0')
            {
                str[i++] = ch;
                str[i] = '';
            } else {
                printf("错误, 未知的字符: %c.", ch);
                return !0;
            }
        }
        if ((le = strlen(str)) % 8 != 0)
        {
            printf("拒绝执行, 长度错误: %d.
    ", 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 占用了绝大部分"功劳", 试着优化一下

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 
     6 char *showMem(void *p, unsigned size)
     7 {
     8     char *buf = 0;
     9     int prs = 0;
    10     unsigned i = 0;
    11     unsigned j = 0;
    12     char ch = '';
    13     unsigned tmp = 0;
    14 
    15     if ((buf = (char *)malloc(size * 9)) == 0)
    16     {
    17         fprintf(stderr, "Execute failed, PC have not memory.
    ");
    18         return 0;
    19     }
    20 
    21     printf("Show %p, count %u bits.
    ", p, size * 8);
    22     for (i = 0; i < size; i++)
    23     {
    24         ch = ((char *)p)[i]; // Get char p[i]
    25 
    26 
    27         for (j = 0; j < 8; j++) // p[i] to 8 bit unsigned int
    28         {
    29             tmp = ch >> (7 - j) & 1;
    30             buf[prs++] = (tmp == 0 ? 0x30 : 0x31);
    31         }
    32         buf[prs++] = ' ';
    33     }
    34     buf[prs - 1] = '';
    35     puts(buf);
    36     return buf;
    37 }
    showMem.c 性能40+倍提升( -_-! )
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 #include "MemUtil.h"
     6 
     7 // Setting memory
     8 // Return:
     9 //      设置完成的字节数
    10 //      -1 代表错误
    11 int setMem(void *p, const char *c)
    12 {
    13     int le = 0;
    14     char *str = 0; // 去除空格的副本
    15     int i = 0;
    16     int j = 0;
    17     char ch = 0;
    18 
    19     le = strlen(c);
    20     str = (char *)malloc(le);
    21 
    22     // 去除空格和换行
    23     while ((ch = *(char *)c++) != '')
    24     {
    25         if (ch == ' ' || ch == '
    ')
    26             continue;
    27         if (ch == 0x31 || ch == 0x30)
    28         {
    29             str[i++] = ch;
    30         } else {
    31             printf("Oops, dead character %c.", ch);
    32             return -1;
    33         }
    34     }
    35     str[i] = '';
    36 
    37     if ((le = strlen(str)) % 8 != 0)
    38     {
    39         printf("You setting data is fucking, 错误的余数 %d.
    ", le % 8);
    40         return -1;
    41     }
    42 
    43     i = 0;
    44     j = le / 8;
    45     for (; i < j; i++)
    46     {
    47         char tmp = 0;
    48         int k = 0;
    49 
    50         for (; k < 8; k++)
    51         {
    52             tmp |= (str[i * 8 + k] ^ 0x30) << (7 - k);
    53         }
    54         ((char *)p)[i] = tmp;
    55     }
    56     return j;
    57 }
    setMem.c 优化调整
  • 相关阅读:
    领域驱动设计学习笔记(一 事件总线)
    枚举位预算 (适用于权限和拥有多种枚举值)
    Javascript闭包(狗血剧情,通俗易懂)
    Xml序列化和反序列化
    Javascript轮播 支持平滑和渐隐两种效果(可以只有两张图)
    Git使用教程
    MySQL数据库基本用法-聚合-分组
    MySQL数据库基本用法-查询
    MySQL数据库基本用法
    JS中获取文件点之后的后缀字符
  • 原文地址:https://www.cnblogs.com/develon/p/8982037.html
Copyright © 2011-2022 走看看