Separate tests for reading and writing.

This commit is contained in:
gordon%netscape.com 2001-01-23 04:16:27 +00:00
Родитель 56736e0108
Коммит cec42466c4
1 изменённых файлов: 158 добавлений и 106 удалений

Просмотреть файл

@ -1,13 +1,26 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
Subject: *
Date: * The contents of this file are subject to the Mozilla Public
Thu, 11 Jan 2001 16:38:10 -0800 * License Version 1.1 (the "License"); you may not use this file
From: * except in compliance with the License. You may obtain a copy of
Doug Turner <dougt@z.netscape.com> * the License at http://www.mozilla.org/MPL/
To: *
gordon@netscape.com * Software distributed under the License is distributed on an "AS
*/ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is nsCacheManager.h, released January 22, 2001.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Doug Turner
* Gordon Sheridan
*/
#include "nscore.h" #include "nscore.h"
@ -15,83 +28,90 @@ Subject:
#include "mcom_db.h" #include "mcom_db.h"
#include "nsString.h" #include "nsString.h"
DB* myDB;
#define DATASIZE 512 #define DATASIZE 512
#define ENTRYCOUNT 512 #define ENTRYCOUNT 512
#define USE_ENTRY_ID 1 #define USE_ENTRY_ID 1
#define EXTRA_LOOKUP 1
DB* myDB;
HASHINFO hash_info = {
16*1024 , /* bucket size */
0 , /* fill factor */
0 , /* number of elements */
0 , /* bytes to cache */
0 , /* hash function */
0} ; /* byte order */
int writeDBM(int cycles)
{
DBT db_key, db_data ;
PRIntervalTime time = PR_IntervalNow();
while (cycles--) {
// create database file
myDB = dbopen("/tmp/foodb",
O_RDWR | O_CREAT ,
0600 ,
DB_HASH ,
&hash_info) ;
if (!myDB) {
printf("no db!\n");
return -1;
}
// initalize data to write
int x;
char * data = (char*) malloc(DATASIZE);
for (x=0; x<DATASIZE; x++)
*data = '\0';
for (x=1; x<=ENTRYCOUNT; x++) {
nsCAutoString keyName("foo");
keyName.AppendInt( x );
db_key.data = (char*)keyName;
db_key.size = keyName.Length();
db_data.data = data;
db_data.size = DATASIZE ;
if(0 != (*myDB->put)(myDB, &db_key, &db_data, 0)) {
printf("--> Error putting\n");
return -1;
}
#if USE_ENTRY_ID
db_key.data = (void*)&x;
db_key.size = sizeof(x);
db_data.data = (char*)keyName;
db_data.size = keyName.Length();
if(0 != (*myDB->put)(myDB, &db_key, &db_data, 0)) {
printf("--> Error putting\n");
return -1;
}
#endif
}
(*myDB->sync)(myDB, 0);
free(data);
}
return PR_IntervalToMilliseconds( PR_IntervalNow() - time);
}
int int
testDBM(int cycles) readDBM(int cycles)
{ {
// create database file
HASHINFO hash_info = {
16*1024 , /* bucket size */
0 , /* fill factor */
0 , /* number of elements */
0 , /* bytes to cache */
0 , /* hash function */
0} ; /* byte order */
myDB = dbopen("/tmp/foodb",
O_RDWR | O_CREAT ,
0600 ,
DB_HASH ,
&hash_info) ;
if (!myDB) {
printf("no db!\n");
return -1;
}
// initalize data to write
int x;
char * data = (char*) malloc(DATASIZE);
for (x=0; x<DATASIZE; x++)
*data = '\0';
// write key-data pairs to database
DBT db_key, db_data ;
for (x=1; x<=ENTRYCOUNT; x++) {
nsCAutoString keyName("foo");
keyName.AppendInt( x );
db_key.data = (char*)keyName;
db_key.size = keyName.Length();
db_data.data = data;
db_data.size = DATASIZE ;
if(0 != (*myDB->put)(myDB, &db_key, &db_data, 0)) {
printf("--> Error putting\n");
return -1;
}
#if USE_ENTRY_ID
db_key.data = (void*)&x;
db_key.size = sizeof(x);
db_data.data = (char*)keyName;
db_data.size = keyName.Length();
if(0 != (*myDB->put)(myDB, &db_key, &db_data, 0)) {
printf("--> Error putting\n");
return -1;
}
#endif
}
(*myDB->sync)(myDB, 0);
free(data);
// begin timing "lookups" // begin timing "lookups"
int status = 0 ; int status = 0 ;
DBT db_key, db_data ;
PRIntervalTime time = PR_IntervalNow(); PRIntervalTime time = PR_IntervalNow();
while (cycles--) { while (cycles--) {
for (x=1; x<=ENTRYCOUNT; x++) { for (int x=1; x<=ENTRYCOUNT; x++) {
#if USE_ENTRY_ID #if USE_ENTRY_ID
DBT entry_data; DBT entry_data;
@ -116,6 +136,17 @@ testDBM(int cycles)
printf("Bad Status %d\n", status); printf("Bad Status %d\n", status);
return -1; return -1;
} }
#if EXTRA_LOOKUP
db_key.data = (void*)&x;
db_key.size = sizeof(x);
status = (*myDB->get)(myDB, &db_key, &entry_data, 0);
if(status != 0) {
printf("Bad Status %d\n", status);
return -1;
}
#endif
} }
} }
(*myDB->sync)(myDB, 0); (*myDB->sync)(myDB, 0);
@ -126,7 +157,7 @@ testDBM(int cycles)
int int
testFile(int cycles) writeFile(int cycles)
{ {
FILE* file; FILE* file;
int fStatus; int fStatus;
@ -134,39 +165,51 @@ testFile(int cycles)
char * data = (char*) malloc(DATASIZE); char * data = (char*) malloc(DATASIZE);
for (x=0; x<DATASIZE; x++) for (x=0; x<DATASIZE; x++)
*data = '\0'; *data = '\0';
// create "cache" directories
mkdir("/tmp/foo", 0755);
for (x=0; x<32; x++) {
nsCAutoString filename; filename.Assign("/tmp/foo/");
filename.AppendInt(x);
mkdir(filename, 0755);
}
// create "cache" files PRIntervalTime time = PR_IntervalNow();
for (x=1; x<=ENTRYCOUNT; x++) { while (cycles--) {
nsCAutoString filename; filename.Assign("/tmp/foo/"); // create "cache" directories
filename.AppendInt( x % 32 ); mkdir("/tmp/foo", 0755);
filename.Append("/");
filename.AppendInt( x );
file = fopen(filename, "w"); for (x=0; x<32; x++) {
if (!file) nsCAutoString filename; filename.Assign("/tmp/foo/");
printf("bad filename? %s\n", (char*)filename); filename.AppendInt(x);
mkdir(filename, 0755);
}
fStatus = fwrite (data, DATASIZE, 1, file); // create "cache" files
if (fStatus == -1) { for (x=1; x<=ENTRYCOUNT; x++) {
printf("Bad fStatus %d\n", errno); nsCAutoString filename; filename.Assign("/tmp/foo/");
exit(1); filename.AppendInt( x % 32 );
} filename.Append("/");
fclose(file); filename.AppendInt( x );
file = fopen(filename, "w");
if (!file)
printf("bad filename? %s\n", (char*)filename);
fStatus = fwrite (data, DATASIZE, 1, file);
if (fStatus == -1) {
printf("Bad fStatus %d\n", errno);
exit(1);
}
fclose(file);
}
} }
return PR_IntervalToMilliseconds( PR_IntervalNow() - time);
}
int
readFile(int cycles)
{
FILE* file;
int fStatus;
// begin timing "lookups" // begin timing "lookups"
PRIntervalTime time = PR_IntervalNow(); PRIntervalTime time = PR_IntervalNow();
while (cycles--) { while (cycles--) {
for (x=1; x<=ENTRYCOUNT; x++) { for (int x=1; x<=ENTRYCOUNT; x++) {
nsCAutoString filename; filename.Assign("/tmp/foo/"); nsCAutoString filename; filename.Assign("/tmp/foo/");
filename.AppendInt( x % 32 ); filename.AppendInt( x % 32 );
filename.Append("/"); filename.Append("/");
@ -194,13 +237,22 @@ testFile(int cycles)
} }
void int
main(void) main(void)
{ {
int totalDBMTime = testDBM(32); int totalDBMTime = writeDBM(32);
int totalFileTime = testFile(32); int totalFileTime = writeFile(32);
printf("total dbm IO ---- > (%d) milliseconds\n", totalDBMTime); printf("total write dbm IO ---- > (%d) milliseconds\n", totalDBMTime);
printf("total file IO ---- > (%d) milliseconds\n", totalFileTime); printf("total write file IO ---- > (%d) milliseconds\n", totalFileTime);
totalDBMTime = readDBM(32);
totalFileTime = readFile(32);
printf("\n");
printf("total read dbm IO ---- > (%d) milliseconds\n", totalDBMTime);
printf("total read file IO ---- > (%d) milliseconds\n", totalFileTime);
return 0;
} }