perflab finished
This commit is contained in:
@ -3,7 +3,6 @@
|
||||
|
||||
#include "options.h"
|
||||
#include "string.h"
|
||||
#include <omp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
@ -26,13 +25,28 @@ typedef void (*lower_fun_t)(char *s);
|
||||
|
||||
/* Lower case conversion routines */
|
||||
|
||||
/* Convert string to lower case: slow */
|
||||
void lower1(char *s) {
|
||||
int i;
|
||||
/* Convert string to lower case: optimized with lookup table */
|
||||
static unsigned char lcase_table[256];
|
||||
static int table_initialized = 0;
|
||||
|
||||
for (i = 0; i < Strlen(s); i++)
|
||||
if (s[i] >= 'A' && s[i] <= 'Z')
|
||||
s[i] -= ('A' - 'a');
|
||||
void init_lcase_table() {
|
||||
if (!table_initialized) {
|
||||
int i;
|
||||
for (i = 0; i < 256; i++)
|
||||
lcase_table[i] = i;
|
||||
for (i = 'A'; i <= 'Z'; i++)
|
||||
lcase_table[i] = i - ('A' - 'a');
|
||||
table_initialized = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void lower1(char *s) {
|
||||
init_lcase_table();
|
||||
unsigned char *us = (unsigned char *)s;
|
||||
while (*us) {
|
||||
*us = lcase_table[*us];
|
||||
us++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Convert string to lower case: faster */
|
||||
@ -137,9 +151,20 @@ unsigned h_xor(char *s) {
|
||||
return val % tsize;
|
||||
}
|
||||
|
||||
#define HCNT 3
|
||||
hash_fun_t hash_fun_set[HCNT] = {h_mod, h_add, h_xor};
|
||||
char *hash_fun_names[HCNT] = {"h_mod", "h_add", "h_xor"};
|
||||
/* FNV-1a hash function */
|
||||
unsigned h_fnv1a(char *s) {
|
||||
unsigned hash = 2166136261u;
|
||||
unsigned char *us = (unsigned char *)s;
|
||||
while (*us) {
|
||||
hash ^= *us++;
|
||||
hash *= 16777619u;
|
||||
}
|
||||
return hash % tsize;
|
||||
}
|
||||
|
||||
#define HCNT 4
|
||||
hash_fun_t hash_fun_set[HCNT] = {h_mod, h_add, h_xor, h_fnv1a};
|
||||
char *hash_fun_names[HCNT] = {"h_mod", "h_add", "h_xor", "h_fnv1a"};
|
||||
|
||||
char *save_string(char *s) {
|
||||
char *result = (char *)malloc(Strlen(s) + 1);
|
||||
@ -194,7 +219,6 @@ h_ptr find_ele_iter_f(h_ptr ls, char *s) {
|
||||
h_ptr find_ele_iter_r(h_ptr ls, char *s) {
|
||||
h_ptr ele = ls;
|
||||
h_ptr last = NULL;
|
||||
#pragma omp parallel shared(ls, s, last)
|
||||
for (ele = ls; ele; ele = ele->next) {
|
||||
char *word = ele->word;
|
||||
if (strcmp(s, word) == 0) {
|
||||
@ -220,10 +244,10 @@ h_ptr find_ele_iter_r(h_ptr ls, char *s) {
|
||||
typedef h_ptr (*find_ele_fun_t)(h_ptr, char *);
|
||||
|
||||
#define FCNT 3
|
||||
find_ele_fun_t find_ele_fun_set[FCNT] = {find_ele_iter_r, find_ele_iter_f,
|
||||
find_ele_rec};
|
||||
char *find_ele_fun_names[FCNT] = {"find_ele_iter_r", "find_ele_iter_f",
|
||||
"find_ele_rec"};
|
||||
find_ele_fun_t find_ele_fun_set[FCNT] = {find_ele_rec, find_ele_iter_f,
|
||||
find_ele_iter_r};
|
||||
char *find_ele_fun_names[FCNT] = {"find_ele_rec", "find_ele_iter_f",
|
||||
"find_ele_iter_r"};
|
||||
|
||||
/* Comparision function for sorting */
|
||||
int compare_ele(const void *vele1, const void *vele2) {
|
||||
@ -386,8 +410,8 @@ void word_freq(FILE *src, int verbose, int ngram, int size, int quick,
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int verbose = 1;
|
||||
int size = 1024;
|
||||
int hash_fun_index = 0;
|
||||
int size = 32768; // 修改默认值为32768
|
||||
int hash_fun_index = 3;
|
||||
int lower_fun_index = 0;
|
||||
int find_fun_index = 0;
|
||||
int ngram = 1;
|
||||
|
||||
Reference in New Issue
Block a user