


#include <stdio.h>
#include <stdlib.h>
int calls = 0;
void dummy_io(int *i)
{
*i++;
}
void loopdeloop(char c, int m)
{
char s[512];
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j <= i; j++) {
s[j] = c;
}
s[i+1] = '\0';
//printf("%s\n", s);
dummy_io(&j);
calls++;
}
}
int main (int argc, char *argv[])
{
int i;
for (i = 0; i < 99999; i++)
{
loopdeloop('a', 75);
calls++;
}
printf("Calls(lloop): %d\n", calls);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int calls = 0;
void dummy_io(int *i)
{
*i++;
}
void stack(char c, int m)
{
char s[512];
int i, j;
for (i = 0; i < m;)
{
s[i] = c;
s[++i] = '\0';
//printf("%s\n", s);
dummy_io(&j);
calls++;
}
}
int main (int argc, char *argv[])
{
int i;
for (i = 0; i < 99999; i++)
{
stack('a', 75);
calls++;
}
printf("Calls(stack2): %d\n", calls);
return 0;
}
$ time ./lloop2
Calls(lloop): 7599924
real 0m2.221s
user 0m2.220s
sys 0m0.000s
$ time ./stack2
Calls(stack2): 7599924
real 0m0.134s
user 0m0.140s
sys 0m0.000s
#include <stdio.h>
#include <stdlib.h>
int calls = 0;
void dummy_io(int *i)
{
*i++;
}
void wrapped(int *i, char *s)
{
s[++(*i)] = '\0';
}
void stack(char c, int m)
{
char s[512];
int i, j;
for (i = 0; i < m;)
{
s[i] = c;
wrapped(&i, s);
calls++;
//printf("%s\n", s);
dummy_io(&j);
calls++;
}
}
int main (int argc, char *argv[])
{
int i;
for (i = 0; i < 99999; i++)
{
stack('a', 75);
calls++;
}
printf("Calls(stack3): %d\n", calls);
return 0;
}
$ time ./stack3
Calls(stack3): 15099849
real 0m0.191s
user 0m0.190s
sys 0m0.000s

jmoniz-mac:test jmmoniz$ ls
loopdeloop.c loopdeloop2.c stack.c stack2.c
jmoniz-mac:test jmmoniz$ gcc -o loopdeloop loopdeloop.c
jmoniz-mac:test jmmoniz$ gcc -o loopdeloop2 loopdeloop2.c
jmoniz-mac:test jmmoniz$ gcc -o stack stack.c
jmoniz-mac:test jmmoniz$ gcc -o stack2 stack2.c
jmoniz-mac:test jmmoniz$ time ./loopdeloop
real 0m0.954s
user 0m0.951s
sys 0m0.002s
jmoniz-mac:test jmmoniz$ time ./loopdeloop2
Calls(lloop): 7599924
real 0m0.736s
user 0m0.733s
sys 0m0.002s
jmoniz-mac:test jmmoniz$ time ./stack
real 0m0.045s
user 0m0.042s
sys 0m0.002s
jmoniz-mac:test jmmoniz$ time ./stack2
Calls(stack3): 15099849
real 0m0.062s
user 0m0.059s
sys 0m0.002s
(gdb) disas loopdeloop
Dump of assembler code for function loopdeloop:
0x0000000100000e5b <loopdeloop+0>: push %rbp
0x0000000100000e5c <loopdeloop+1>: mov %rsp,%rbp
0x0000000100000e5f <loopdeloop+4>: sub $0x20,%rsp
0x0000000100000e63 <loopdeloop+8>: mov %esi,-0x18(%rbp)
0x0000000100000e66 <loopdeloop+11>: mov %dil,-0x14(%rbp)
0x0000000100000e6a <loopdeloop+15>: movl $0x0,-0x4(%rbp)
0x0000000100000e71 <loopdeloop+22>: jmp 0x100000e9c <loopdeloop+65>
0x0000000100000e73 <loopdeloop+24>: movl $0xffffffff,-0x8(%rbp)
0x0000000100000e7a <loopdeloop+31>: jmp 0x100000e88 <loopdeloop+45>
0x0000000100000e7c <loopdeloop+33>: lea -0xc(%rbp),%rdi
0x0000000100000e80 <loopdeloop+37>: callq 0x100000e4c <dummy_io>
0x0000000100000e85 <loopdeloop+42>: incl -0x8(%rbp)
0x0000000100000e88 <loopdeloop+45>: mov -0x8(%rbp),%eax
0x0000000100000e8b <loopdeloop+48>: cmp -0x4(%rbp),%eax
0x0000000100000e8e <loopdeloop+51>: jl 0x100000e7c <loopdeloop+33>
0x0000000100000e90 <loopdeloop+53>: lea -0xc(%rbp),%rdi
0x0000000100000e94 <loopdeloop+57>: callq 0x100000e4c <dummy_io>
0x0000000100000e99 <loopdeloop+62>: incl -0x4(%rbp)
0x0000000100000e9c <loopdeloop+65>: mov -0x4(%rbp),%eax
0x0000000100000e9f <loopdeloop+68>: cmp -0x18(%rbp),%eax
0x0000000100000ea2 <loopdeloop+71>: jl 0x100000e73 <loopdeloop+24>
0x0000000100000ea4 <loopdeloop+73>: leaveq
0x0000000100000ea5 <loopdeloop+74>: retq
End of assembler dump.
(gdb) disas stack
Dump of assembler code for function stack:
0x0000000100000df7 <stack+0>: push %rbp
0x0000000100000df8 <stack+1>: mov %rsp,%rbp
0x0000000100000dfb <stack+4>: sub $0x230,%rsp
0x0000000100000e02 <stack+11>: mov %esi,-0x228(%rbp)
0x0000000100000e08 <stack+17>: mov %dil,-0x224(%rbp)
0x0000000100000e0f <stack+24>: mov 0x212(%rip),%rax # 0x100001028
0x0000000100000e16 <stack+31>: mov (%rax),%rdx
0x0000000100000e19 <stack+34>: mov %rdx,-0x8(%rbp)
0x0000000100000e1d <stack+38>: xor %edx,%edx
0x0000000100000e1f <stack+40>: cmpl $0x1ff,-0x228(%rbp)
0x0000000100000e29 <stack+50>: jg 0x100000e7e <stack+135>
0x0000000100000e2b <stack+52>: movl $0x0,-0x214(%rbp)
0x0000000100000e35 <stack+62>: jmp 0x100000e70 <stack+121>
0x0000000100000e37 <stack+64>: mov -0x214(%rbp),%eax
0x0000000100000e3d <stack+70>: movslq %eax,%rdx
0x0000000100000e40 <stack+73>: movzbl -0x224(%rbp),%eax
0x0000000100000e47 <stack+80>: mov %al,-0x210(%rbp,%rdx,1)
0x0000000100000e4e <stack+87>: incl -0x214(%rbp)
0x0000000100000e54 <stack+93>: mov -0x214(%rbp),%eax
0x0000000100000e5a <stack+99>: cltq
0x0000000100000e5c <stack+101>: movb $0x0,-0x210(%rbp,%rax,1)
0x0000000100000e64 <stack+109>: lea -0x218(%rbp),%rdi
0x0000000100000e6b <stack+116>: callq 0x100000de8 <dummy_io>
0x0000000100000e70 <stack+121>: mov -0x214(%rbp),%eax
0x0000000100000e76 <stack+127>: cmp -0x228(%rbp),%eax
0x0000000100000e7c <stack+133>: jl 0x100000e37 <stack+64>
0x0000000100000e7e <stack+135>: mov 0x1a3(%rip),%rax # 0x100001028
0x0000000100000e85 <stack+142>: mov -0x8(%rbp),%rdx
0x0000000100000e89 <stack+146>: xor (%rax),%rdx
0x0000000100000e8c <stack+149>: je 0x100000e93 <stack+156>
0x0000000100000e8e <stack+151>: callq 0x100000ed0 <dyld_stub___stack_chk_fail>
0x0000000100000e93 <stack+156>: leaveq
0x0000000100000e94 <stack+157>: retq
End of assembler dump.
jmoniz-mac:test jmmoniz$ gcc -O3 -o loopdeloop loopdeloop.c
jmoniz-mac:test jmmoniz$ gcc -O3 -o loopdeloop2 loopdeloop2.c
jmoniz-mac:test jmmoniz$ gcc -O3 -o stack stack.c
jmoniz-mac:test jmmoniz$ gcc -O3 -o stack2 stack2.c
jmoniz-mac:test jmmoniz$ time ./loopdeloop
real 0m0.003s
user 0m0.000s
sys 0m0.002s
jmoniz-mac:test jmmoniz$ time ./loopdeloop2
Calls(lloop): 7599924
real 0m0.016s
user 0m0.014s
sys 0m0.002s
jmoniz-mac:test jmmoniz$ time ./stack
real 0m0.003s
user 0m0.000s
sys 0m0.002s
jmoniz-mac:test jmmoniz$ time ./stack2
Calls(stack3): 15099849
real 0m0.019s
user 0m0.017s
sys 0m0.001s


Users browsing this forum: No registered users and 0 guests