summaryrefslogtreecommitdiff
path: root/amount.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2004-08-25 01:47:55 -0400
committerJohn Wiegley <johnw@newartisans.com>2004-08-25 01:47:55 -0400
commit6febfc3b4cd6b374479f34070da9a772f9ff5699 (patch)
tree941ff96e45bd412003be1dab05baf1f9404bf001 /amount.cc
parentc6860970f27ed1f0d9b9543da46ffffa5c20e8f6 (diff)
downloadfork-ledger-6febfc3b4cd6b374479f34070da9a772f9ff5699.tar.gz
fork-ledger-6febfc3b4cd6b374479f34070da9a772f9ff5699.tar.bz2
fork-ledger-6febfc3b4cd6b374479f34070da9a772f9ff5699.zip
Bulk alloc bigints in the binary reader; this gains another 20%
Diffstat (limited to 'amount.cc')
-rw-r--r--amount.cc37
1 files changed, 24 insertions, 13 deletions
diff --git a/amount.cc b/amount.cc
index 8915e91f..49762d17 100644
--- a/amount.cc
+++ b/amount.cc
@@ -11,23 +11,26 @@
namespace ledger {
+#define BIGINT_BULK_ALLOC 0x0001
+
class amount_t::bigint_t {
public:
- mpz_t val;
- unsigned int prec;
- unsigned int ref;
- unsigned int index;
+ mpz_t val;
+ unsigned short prec;
+ unsigned short flags;
+ unsigned int ref;
+ unsigned int index;
- bigint_t() : prec(0), ref(1), index(0) {
+ bigint_t() : prec(0), flags(0), ref(1), index(0) {
DEBUG_PRINT("ledger.memory.ctors", "ctor amount_t::bigint_t");
mpz_init(val);
}
- bigint_t(mpz_t _val) : prec(0), ref(1), index(0) {
+ bigint_t(mpz_t _val) : prec(0), flags(0), ref(1), index(0) {
DEBUG_PRINT("ledger.memory.ctors", "ctor amount_t::bigint_t");
mpz_init_set(val, _val);
}
bigint_t(const bigint_t& other)
- : prec(other.prec), ref(1), index(0) {
+ : prec(other.prec), flags(0), ref(1), index(0) {
DEBUG_PRINT("ledger.memory.ctors", "ctor amount_t::bigint_t");
mpz_init_set(val, other.val);
}
@@ -38,6 +41,10 @@ class amount_t::bigint_t {
}
};
+unsigned int sizeof_bigint_t() {
+ return sizeof(amount_t::bigint_t);
+}
+
#define MPZ(x) ((x)->val)
static mpz_t temp;
@@ -177,8 +184,12 @@ amount_t::amount_t(const double value)
void amount_t::_release()
{
- if (--quantity->ref == 0)
- delete quantity;
+ if (--quantity->ref == 0) {
+ if (! (quantity->flags & BIGINT_BULK_ALLOC))
+ delete quantity;
+ else
+ quantity->~bigint_t();
+ }
}
void amount_t::_init()
@@ -886,6 +897,7 @@ void amount_t::write_quantity(std::ostream& out) const
if (quantity->index == 0) {
quantity->index = ++index;
+ bigints_count++;
byte = 1;
out.write(&byte, sizeof(byte));
@@ -925,8 +937,8 @@ void amount_t::read_quantity(std::istream& in)
return;
if (byte == 1) {
- quantity = new bigint_t;
- bigints.push_back(quantity);
+ quantity = new(bigints_next++) bigint_t;
+ quantity->flags |= BIGINT_BULK_ALLOC;
unsigned short len;
in.read((char *)&len, sizeof(len));
@@ -942,8 +954,7 @@ void amount_t::read_quantity(std::istream& in)
} else {
unsigned int index;
in.read((char *)&index, sizeof(index));
- assert(index <= bigints.size());
- quantity = bigints[index - 1];
+ quantity = bigints + (index - 1);
quantity->ref++;
DEBUG_PRINT("ledger.amount.bigint-show",
"bigint " << quantity << " ++ref " << quantity->ref);