跳至正文

Glibc 中的 memset

  • 技术

Glibc的效率真的快!快到让我想不到!!!
这个memset跑的贼快~!不过我还是没想通,为什么不用汇编呢?sep movw,速度可能更快!
对memset的注释如下:

C语言: [Codee#12483](http://fayaa.com/code/view/12483/)

void *memset(void *dstpp, int c, size_t len)
{
 long int dstp = (long int) dstpp;
 /* 正在翻阅为什么用long int 而不是void *. */
 /[......]

继续阅读

USACO 3.2.6 Sweet Butter 香甜的黄油 解题报告

这题一开始我用的那个O(n^3)的算法,叫什么名字我忘了,肯定是超时了咯,因为图是稀疏图,这样是肯定超时的,后来就看标称,看了好久,真没想到标称竟然如此精妙,里面设计了一个能够以O(1)的速度查找元素的功能,整个程序是执行了至多n次Dijkstra算法,然后我在里面增加了一些优化(几乎和时间无关的优化,因为数据量太大,CPU又太好用了),比如用位运算代替乘除法(乘以或除以2),在上滤和下滤的过程把递归改成了非递归,防止重复的牛所在的牧场进行计算,让heap_val在上滤和下滤的过程中不修改,反正最大的数据程序还是要[……]

继续阅读

奖学金 解题报告

这是个水题,我直接使用了库函数qsort进行了排序,然后输出前五个就可以了,唯一想要说的就是明天或后天把Glibc中的qsort代码看下,学习一下是怎么对超级巨大的数据量进行快速排序的,一个个交换肯定不是,这些都明天再说吧。

#include <stdio.h>
#include <stdlib.h>
#define MAX 300
struct grade{
 int a, b, c;
 int id;
}totle[MAX];
int compare(const void *a, con[......]

继续阅读

2^k进制数 解题报告

这题困扰了我好几天,详细看了别人的题解,自己反复琢磨,终于琢磨透了。
把我的思路讲一下,f[i][j] 表示第i位(从右向左数, 如12中的1是第二位),则很容易得到一个DP:
f[i][j] = f[i – 1][j + 1] + f[i – 1][j + 2] + f[i – 1][j + 3] + …. + f[i – 1][n] (n为极限,放在后面讲。)
不用说,用这个递推公式绝对会超时,所以还需要对公式观察一下:
f[i][j] = f[i – 1][j + 1] + f[i – 1][j + 2][……]

继续阅读

Glibc 的 strcmp

  • 技术

Glibc的设计确实巧妙的让人想不到,如下strcmp的代码就十分巧妙:

C语言: Codee#12462

int
strcmp (p1, p2)
 const char p1;
 const char p2;
{
 register const unsigned char s1 = (const unsigned char ) p1;
 register const unsigned char s2 = (const unsigned char ) p2;
 unsigned reg_char c1, c2;[......]

继续阅读

快速成法

  • 技术

  当x乘以n的时候,一般人使用的是mul指令(即直接相乘),而我会使用位运算来优化这些速度,比如乘以3,就等于((x << 1) + x),相当于2x+x 就是3x了,然而这后者的速度比前者的速度快很多。
  乘以3只是一个情况,乘以n的话,就要把n拆分成2的次方相加,更一般地,就是把n用二进制表示,然后把位为1的进行处理,没表达清楚吧,再举个例子:5,它的二进制是101,也就是4+1,那么就可以把n5表示成4n+n,也就是((n << 2) + n),再比如8把,8*n的二进制是1000,[……]

继续阅读

快速置零 xor %eax, %eax

  • 技术

  在<<Linux 内核完全注释>>里面看到了几次xor ax, ax,很想不通,为什么不直接用mov ax, 0呢?今日到网上一搜才知道,我的天啊,xor ax, ax 只需要计算机2条指令,而mov ax, 0会消耗计算机5指令,什么意思?就是近三倍的速度差别。

[……]

继续阅读

[转]as86的man

  • 技术

as86(1)                                                                as86(1)

名称
    &nb[……]

继续阅读