CategoryGOODSPOST++ShMemFastDBGigaBASEPERSTDyBASEConsusMiniDB
Languages C++, C#, Java C++ C++ C++, C, Delphi C++, C, Java, Perl, C#, PHP Java or C# Python, PHP, Ruby, Rebol Java C++
Concurrent access Clients at different network nodes Single process (mutual exclusion of process threads) Processes and threads within one computer Processes and threads within one computer, remote clients Threads within one process, remote clients Single process (mutual exclusion of process threads) Single process (mutual exclusion of process threads) Threads within one process, remote clients Not allowed
Transactions Local and global transactions based on local REDO log and global history log UNDO log - log-less atomic update mechanism with zero recovery time log-less atomic update mechanism with zero recovery time log-less atomic update mechanism with zero recovery time log-less atomic update mechanism with zero recovery time log-less atomic update mechanism with zero recovery time UNDO log
Locking object level shared and exclusive locks database critical section storage shared and exclusive locks database shared and exclusive locks: multiple-readers-single-write model, concurrent read and update database shared and exclusive locks: multiple-readers-single-write model concurrent access support, shared and exclusive object locks concurrent access support, shared and exclusive object locks database shared and exclusive locks: multiple-readers-single-write model not supported
Access to persistent data transparent access using smart pointers for C++, byte code preprocessor for Java and remoting API for C# transparent access by normal C pointers transparent access by normal C pointers access through cursors access through cursors semitransparent access using normal references semitransparent access using normal references access through cursors access through smart pointers or ()/[] operators
Access to database file page pool virtual memory virtual memory virtual memory page pool page pool + object cache page pool + object cache page pool + object cache page pool + object cache
Supported containers B*-tree, R-tree, set, hash table, H-tree AVL-tree, R-tree, T-tree, hash table queue T-tree, extensible hash table, GiST, time seriers B+tree, R-Tree, GiST, time seriers B+tree, R-Tree, one-to-many relations B+tree, arrays B+tree extensible hash table
memory deallocation garbage collection explicit or implicit(GC) explicit explicit explicit explicit or implicit(GC) explicit or implicit(GC) explicit or implicit(GC) explicit
Query language - - - + + + - + -
Scheme evaluation support + - - + + + + + -
Client-server architecture + - - (+) (+) - - + -
Replication support + - - + + + - - -
Portable database file format + - - - - + - + -
Where to be used distributed systems with client-server architecture storage of persistent objects, personal database, snapshots interprocess communication realtime and performance critical applications application requiring fast index/reference access to the data (WWW database server for example) storage of persistent objects storage of persistent objects Java applications working with databases through JDBC interface small and portable embedded database engine

I have three products GigaBASE, PERST and DyBASE build on the same core. GigaBASE is implemented in C++ and its main API is for C++ API. It also provides CLI APIs for C, Java, PHP, C# and Perl. PERST has two implementations: in Java and C-Sharp and them provide API to the correspondent languages. DyBASE mostly reuses GigaBASE implementation and provides API to the languages with dynamic type checking: Python, Ruby, PHP and Rebol. Also I include port of TestIndex.java for commercial OODBMS ObjectStore PSE Pro.

I run the same simple test implemented in C++, Java, C-Sharp, PHP, Python, Ruby and Rebol. This test contains three steps:

  1. Create specified number of records with random long and string key and include it in long and string indices. After inserting of all records, commit is performed.
  2. Search for each record using long and string key.
  3. Search and remove each record from the indices and deallocate it from the storage.

Time of each step exceution is measured. Number of records in each case is the same - 100000. Page pool size in all cases is 32Mb, which is enough to hold all records in memory. All test were executed at the same computer: AMD Athlon 1.3G, 512Mb RAM, WinXP. I am using MS Visual.NET 2003 C++ compiler, Java JDK 1.4, Python 2.3.2, PHP 4.3., Ruby 1.8.0 and Rebol/View 1.2.10.3.1. I divide time of each step by number of iteration and produce the following results:

ColorLanguageDatabase
1C++GigaBASE
2JavaPERST
3C-SharpPERST
4RubyDyBase
5PythonDyBase
6PHPDyBase
7RebolDyBase
8JavaObjectStore PSE Pro
9JavaGigaBASE

Index searches per second

1289436
349322
240758
914695
68000
57789
87328
44348
73922

Stored objects per second

125806
318252
215528
98845
55748
64347
84248
43571
72941

Removed objects per second

120846
216837
315131
814123
99742
44761
54130
63704
72041


Back to my home page | Send me a mail