main () { register long a, n, k; long getrand (); setrand (314159269, 453806245, 13); a = 1234; n = 0; k = 0; for (;;) { #define PRINT_NOs #ifdef PRINT_NOs printf ("n = %P, %u\n", a, a); #endif PRINT_NOs n++; k++; if ((a = getrand (a)) == 1234) break; if (k == 1000000) { k = 0; printf("passaram-se %d numeros sem repetição \n", n); } } printf ("deu igual depois de %d numeros \n", n); }
int main(int argc, char * argv[]) { if (argc != 3) usage(argv[0]); int n = atol(argv[2]); srand(701888); env = sp_env(); sp_ctl(env, SPDIR, SPO_CREAT|SPO_RDWR, "./sophia_bench_data"); db = sp_open(env); if (db == NULL) { printf("open: %s\n", sp_error(env)); return 1; } int rc = 0; unsigned long long start = now(); switch (benchof(argv[1])) { case SETSEQ: rc = setseq(n); break; case SETRAND: rc = setrand(n); break; case GETSEQ:rc = getseq(n); break; case GETRAND: rc = getrand(n); break; case RANGEFWD: rc = rangefwd(n); break; case UNKNOWN: printf("unknown operation\n"); } if (rc == 0) { unsigned long long diff = now() - start; float rps = n / (diff / 1000.0); printf("%d rps\n", (int)rps); } if (keytraversed > 0 && keytraversed != n) printf("(%d keys traversed)\n", keytraversed); sp_destroy(db); sp_destroy(env); return rc; }
/* exe_one - execute one instruction */ void exe_one(void) { /* get the opcode */ opcode = getcbyte(pc); pc++; /* execute the instruction */ switch (opcode) { case OP_CALL: *--sp = getboperand(); *--sp = pc; *--sp = (int)(top - fp); fp = sp; pc = getafield(fp[fp[2]+3],A_CODE); break; case OP_SEND: *--sp = getboperand(); *--sp = pc; *--sp = (int)(top - fp); fp = sp; if (p2 = fp[fp[2]+3]) p2 = getofield(p2,O_CLASS); else p2 = fp[fp[2]+2]; if (p2 && (p2 = getp(p2,fp[fp[2]+1]))) { pc = getafield(p2,A_CODE); break; } *sp = NIL; /* return NIL if there is no method for this message */ case OP_RETURN: if (fp == top) sts = CHAIN; else { p2 = *sp; sp = fp; fp = top - *sp++; pc = *sp++; p3 = *sp++; sp += p3; *sp = p2; } break; case OP_TSPACE: sp -= getboperand(); break; case OP_TMP: p2 = getboperand(); *sp = fp[-p2-1]; break; case OP_TSET: p2 = getboperand(); fp[-p2-1] = *sp; break; case OP_ARG: p2 = getboperand(); if (p2 >= fp[2]) error("too few arguments"); *sp = fp[p2+3]; break; case OP_ASET: p2 = getboperand(); if (p2 >= fp[2]) error("too few arguments"); fp[p2+3] = *sp; break; case OP_BRT: pc = (*sp ? getwoperand() : pc+2); break; case OP_BRF: pc = (*sp ? pc+2 : getwoperand()); break; case OP_BR: pc = getwoperand(); break; case OP_T: *sp = T; break; case OP_NIL: *sp = NIL; break; case OP_PUSH: *--sp = NIL; break; case OP_NOT: *sp = (*sp ? NIL : T); break; case OP_ADD: p2 = *sp++; *sp += p2; break; case OP_SUB: p2 = *sp++; *sp -= p2; break; case OP_MUL: p2 = *sp++; *sp *= p2; break; case OP_DIV: p2 = *sp++; *sp = (p2 == 0 ? 0 : *sp / p2); break; case OP_REM: p2 = *sp++; *sp = (p2 == 0 ? 0 : *sp % p2); break; case OP_BAND: p2 = *sp++; *sp &= p2; break; case OP_BOR: p2 = *sp++; *sp |= p2; break; case OP_BNOT: *sp = ~*sp; break; case OP_LT: p2 = *sp++; *sp = (*sp < p2 ? T : NIL); break; case OP_EQ: p2 = *sp++; *sp = (*sp == p2 ? T : NIL); break; case OP_GT: p2 = *sp++; *sp = (*sp > p2 ? T : NIL); break; case OP_LIT: *sp = getwoperand(); break; case OP_SPLIT: *sp = getboperand(); break; case OP_SNLIT: *sp = -getboperand(); break; case OP_VAR: *sp = getvalue(getwoperand()); break; case OP_SVAR: *sp = getvalue(getboperand()); break; case OP_SET: setvalue(getwoperand(),*sp); break; case OP_SSET: setvalue(getboperand(),*sp); break; case OP_GETP: p2 = *sp++; *sp = getp(*sp,p2); break; case OP_SETP: p3 = *sp++; p2 = *sp++; *sp = setp(*sp,p2,p3); break; case OP_PRINT: print(*sp); break; case OP_PNUMBER: pnumber(*sp); break; case OP_PNOUN: show_noun(*sp); break; case OP_TERPRI: trm_chr('\n'); break; case OP_FINISH: sts = FINISH; break; case OP_CHAIN: sts = CHAIN; break; case OP_ABORT: sts = ABORT; break; case OP_EXIT: #ifdef MAC macpause(); #endif trm_done(); exit(); break; case OP_YORN: trm_get(line); *sp = (line[0] == 'Y' || line[0] == 'y' ? T : NIL); break; case OP_CLASS: *sp = getofield(*sp,O_CLASS); break; case OP_MATCH: p2 = *sp++; *sp = (match(*sp,nouns[p2-1],adjectives[p2-1]) ? T : NIL); break; case OP_SAVE: *sp = db_save(); break; case OP_RESTORE: *sp = db_restore(); break; case OP_RESTART: *sp = db_restart(); break; case OP_RAND: *sp = getrand(*sp); break; case OP_RNDMIZE: setrand(time(0L)); *sp = NIL; break; default: if (opcode >= OP_XVAR && opcode < OP_XSET) *sp = getvalue(opcode - OP_XVAR); else if (opcode >= OP_XSET && opcode < OP_XPLIT) setvalue(opcode - OP_XSET,*sp); else if (opcode >= OP_XPLIT && opcode < OP_XNLIT) *sp = opcode - OP_XPLIT; else if (opcode >= OP_XNLIT && opcode < 256) *sp = OP_XNLIT - opcode; else trm_str("Bad opcode\n"); break; } }