Skip to content

Commit

Permalink
feat: benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
niranjannitesh committed Feb 15, 2023
1 parent befb3c3 commit b3cdae2
Show file tree
Hide file tree
Showing 4 changed files with 240 additions and 89 deletions.
166 changes: 91 additions & 75 deletions cpp/msgpack.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ static bool mp_reader(cmp_ctx_t *ctx, void *data, size_t limit);
jsi::Value readObject(cmp_ctx_t *ctx, jsi::Runtime &rt, uint32_t length);
jsi::Value readArray(cmp_ctx_t *ctx, jsi::Runtime &rt, uint32_t length);



void writeValue(cmp_ctx_t *ctx, jsi::Runtime &rt, const jsi::Value &value)
{
if (value.isBool())
Expand All @@ -37,14 +35,14 @@ void writeValue(cmp_ctx_t *ctx, jsi::Runtime &rt, const jsi::Value &value)

if (value.isString())
{
auto v = value.getString(rt).utf8(rt);
std::string const &v = value.getString(rt).utf8(rt);
cmp_write_str(ctx, v.c_str(), v.size());
return;
}

if (value.isObject())
{
auto object = std::move(value.getObject(rt));
const auto &object = value.getObject(rt);
if (object.isArray(rt))
{
writeArray(ctx, rt, object);
Expand All @@ -63,23 +61,32 @@ void writeValue(cmp_ctx_t *ctx, jsi::Runtime &rt, const jsi::Value &value)

void writeArray(cmp_ctx_t *ctx, jsi::Runtime &rt, const jsi::Object &object)
{
cmp_write_array(ctx, object.getPropertyNames(rt).size(rt));
auto array = object.asArray(rt);
for (size_t i = 0; i < array.size(rt); i++)
const auto &array = object.getArray(rt);
const size_t length = array.length(rt);
cmp_write_array(ctx, length);

for (size_t i = 0; i < length; i++)
{
writeValue(ctx, rt, std::move(array.getValueAtIndex(rt, i)));
const jsi::Value &value = array.getValueAtIndex(rt, i);
writeValue(ctx, rt, value);
}
}

void writeObject(cmp_ctx_t *ctx, jsi::Runtime &rt, const jsi::Object &object)
{
cmp_write_map(ctx, object.getPropertyNames(rt).size(rt));
auto names = object.getPropertyNames(rt);
const auto &names = object.getPropertyNames(rt);
cmp_write_map(ctx, names.size(rt));

for (size_t i = 0; i < names.size(rt); i++)
{
auto name = names.getValueAtIndex(rt, i).asString(rt);
cmp_write_str(ctx, name.utf8(rt).c_str(), name.utf8(rt).size());
writeValue(ctx, rt, (object.getProperty(rt, name)));
const auto &name = names.getValueAtIndex(rt, i).asString(rt);
const auto &value = object.getProperty(rt, name);

const auto &name_str = name.utf8(rt);
const auto name_len = name_str.size();

cmp_write_str(ctx, name_str.c_str(), name_len);
writeValue(ctx, rt, std::move(value));
}
}

Expand All @@ -94,7 +101,9 @@ struct MessagePackWriter

size_t write(void *data, size_t count)
{
this->data.insert(this->data.end(), (uint8_t *)data, (uint8_t *)data + count);
size_t start = this->data.size();
this->data.resize(start + count);
std::memcpy(this->data.data() + start, data, count);
return count;
}
};
Expand All @@ -107,16 +116,14 @@ static size_t mp_writer(cmp_ctx_t *ctx, const void *data, size_t count)

std::vector<uint8_t> write(jsi::Runtime &rt, const jsi::Value &value)
{
std::vector<uint8_t> data;
MessagePackWriter writer;
std::unique_ptr<cmp_ctx_s> ctx(new cmp_ctx_s);
MessagePackWriter writer;
std::unique_ptr<cmp_ctx_s> ctx(new cmp_ctx_s);
cmp_init(ctx.get(), &writer, mp_reader, NULL, mp_writer);
writeValue(ctx.get(), rt, value);
return std::move(writer.data);
}


jsi::Value readValue(cmp_ctx_t * ctx, jsi::Runtime &rt)
jsi::Value readValue(cmp_ctx_t *ctx, jsi::Runtime &rt)
{
cmp_object_t obj;
if (!cmp_read_object(ctx, &obj))
Expand Down Expand Up @@ -170,29 +177,29 @@ jsi::Value readValue(cmp_ctx_t * ctx, jsi::Runtime &rt)
}

case CMP_TYPE_POSITIVE_FIXNUM:
return jsi::Value((double) obj.as.u8);
return jsi::Value((double)obj.as.u8);
case CMP_TYPE_NEGATIVE_FIXNUM:
return jsi::Value((double) obj.as.s8);
return jsi::Value((double)obj.as.s8);
case CMP_TYPE_FLOAT:
return jsi::Value((double) obj.as.flt);
return jsi::Value((double)obj.as.flt);
case CMP_TYPE_DOUBLE:
return jsi::Value((double) obj.as.dbl);
return jsi::Value((double)obj.as.dbl);
case CMP_TYPE_UINT8:
return jsi::Value((double) obj.as.u8);
return jsi::Value((double)obj.as.u8);
case CMP_TYPE_UINT16:
return jsi::Value((double) obj.as.u16);
return jsi::Value((double)obj.as.u16);
case CMP_TYPE_UINT32:
return jsi::Value((double) obj.as.u32);
return jsi::Value((double)obj.as.u32);
case CMP_TYPE_UINT64:
return jsi::Value((double) obj.as.u64);
return jsi::Value((double)obj.as.u64);
case CMP_TYPE_SINT8:
return jsi::Value((double) obj.as.s8);
return jsi::Value((double)obj.as.s8);
case CMP_TYPE_SINT16:
return jsi::Value((double) obj.as.s16);
return jsi::Value((double)obj.as.s16);
case CMP_TYPE_SINT32:
return jsi::Value((double) obj.as.s32);
return jsi::Value((double)obj.as.s32);
case CMP_TYPE_SINT64:
return jsi::Value((double) obj.as.s64);
return jsi::Value((double)obj.as.s64);

default:
return jsi::Value(jsi::Value::null());
Expand All @@ -206,16 +213,25 @@ jsi::Value readObject(cmp_ctx_t *ctx, jsi::Runtime &rt, uint32_t length)
{
auto key = readValue(ctx, rt).toString(rt);
auto value = readValue(ctx, rt);
if (value.isString()) {
result.setProperty(rt, key, value.getString(rt));
} else if (value.isNumber()) {
result.setProperty(rt, key, value.getNumber());
} else if (value.isBool()) {
result.setProperty(rt, key, value.getBool());
} else if (value.isNull() || value.isUndefined()) {
result.setProperty(rt, key, value.null());
} else if (value.isObject()) {
result.setProperty(rt, key, value.getObject(rt));
if (value.isString())
{
result.setProperty(rt, key, value.getString(rt));
}
else if (value.isNumber())
{
result.setProperty(rt, key, value.getNumber());
}
else if (value.isBool())
{
result.setProperty(rt, key, value.getBool());
}
else if (value.isNull() || value.isUndefined())
{
result.setProperty(rt, key, value.null());
}
else if (value.isObject())
{
result.setProperty(rt, key, value.getObject(rt));
}
}
return result;
Expand All @@ -232,55 +248,55 @@ jsi::Value readArray(cmp_ctx_t *ctx, jsi::Runtime &rt, uint32_t length)
return result;
}


class MessagePackReader {
class MessagePackReader
{
public:
MessagePackReader(const char* data, size_t length) {
this->data = new char[length];
std::memcpy(this->data, data, length);
this->size = length;
index = 0;
}
MessagePackReader(const char *data, size_t length)
{
this->data = new char[length];
std::memcpy(this->data, data, length);
this->size = length;
index = 0;
}

~MessagePackReader() {
delete[] data;
}
~MessagePackReader()
{
delete[] data;
}

size_t read(void *data, size_t limit)
size_t read(void *data, size_t limit)
{
if (this->index + limit > this->size)
{
if (this->index + limit > this->size)
{
return 0;
}
return 0;
}

memcpy(data, this->data + this->index, limit);
memcpy(data, this->data + this->index, limit);

this->index += limit;
return limit;
}
this->index += limit;
return limit;
}

jsi::Value read(jsi::Runtime &rt)
{
cmp_ctx_t ctx;
cmp_init(&ctx, this, _mp_reader, NULL, _mp_writer);
return readValue(&ctx, rt);
}
jsi::Value read(jsi::Runtime &rt)
{
cmp_ctx_t ctx;
cmp_init(&ctx, this, _mp_reader, NULL, _mp_writer);
return readValue(&ctx, rt);
}

private:
char* data;
size_t index;
size_t size;
char *data;
size_t index;
size_t size;
};


static bool _mp_reader(cmp_ctx_t *ctx, void *data, size_t limit)
{
auto *mp = (MessagePackReader *)ctx->buf;
return mp->read(data, limit);
auto *mp = (MessagePackReader *)ctx->buf;
return mp->read(data, limit);
}

static size_t _mp_writer(cmp_ctx_t *ctx, const void *data, size_t count)
{
return 0;
return 0;
}

7 changes: 4 additions & 3 deletions example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@
"pods": "pod-install --quiet"
},
"dependencies": {
"msgpackr": "^1.8.3",
"react": "18.2.0",
"react-native": "0.71.3"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/preset-env": "^7.20.0",
"@babel/runtime": "^7.20.0",
"metro-react-native-babel-preset": "0.73.7",
"babel-plugin-module-resolver": "^4.1.0"
"babel-plugin-module-resolver": "^4.1.0",
"metro-react-native-babel-preset": "0.73.7"
}
}
}
100 changes: 89 additions & 11 deletions example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,98 @@ import * as React from 'react';

import { StyleSheet, View } from 'react-native';
import { encode, decode } from 'react-native-msgpack';
import { unpack, pack } from 'msgpackr/dist';

const obj = {
_id: {
$oid: '5e8b3d2ce1a9cd1cd8e26e15',
},
username: 'niranjannitesh',
verified: false,
password: '$2b$14$SjifJFfAqPROD1.QrVpksuuqxXvpbKhoemPyXbwlFjjDp8kxqQo3W',
profile: {
pronouns: ['he/him/his'],
name: 'Nitesh Kumar Niranjan',
bio: 'Finding magic in a mundane world 🍁',
location: 'India',
date_of_birth: {
$date: {
$numberLong: '1012867200000',
},
},
profile_pic: 'user_profile_pic/ibnkiavqvlsjiaij9wlw',
cover_image:
'https://images.unsplash.com/photo-1493329025335-18542a61595f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxNDcyNzd8MHwxfHNlYXJjaHwzfHxnbGFjaWVyfGVufDB8fHx8MTY0NjMwMzM5MA&ixlib=rb-1.2.1&q=80&w=1920',
},
deactivated: false,
banned_at: null,
banned_by: null,
created_at: {
$date: {
$numberLong: '1580551775000',
},
},
updated_at: {
$date: {
$numberLong: '1660935853175',
},
},
reputation: {
absolute: 2990,
cumulative: 3003,
},
phone: {
iso_alpha_2: 'IN',
number: '+917004153058',
},
email: '[email protected]',
email_verified: true,
google_id: '108045490346839687273',
status: {
emoji: '🤧',
created_at: {
$date: {
$numberLong: '1656247348549',
},
},
},
opted_old_feed: false,
shown_ratings_popup: false,
username_changed_count: 0,
online_status: false,
};

const RUN_CYCLES = 100;
const n = () => {
console.log('comuting with react-native-msgpack');
const startTime = Date.now();
for (let i = 0; i < RUN_CYCLES; i++) {
const resp = encode(obj);
decode(resp);
}
const endTime = Date.now();
console.log('Time taken: ', endTime - startTime, 'ms');
};

const d = () => {
console.log('comuting with msgpackr');
const startTime = Date.now();
for (let i = 0; i < RUN_CYCLES; i++) {
const resp = pack(obj);
unpack(resp);
}
const endTime = Date.now();
console.log('Time taken: ', endTime - startTime, 'ms');
};

export default function App() {
React.useEffect(() => {
const resp = encode({
name: 'Tester',
a: {
b: 'test',
},
c: [1, 2, 3, 4, 5],
d: false,
});
const t = decode(resp);
console.log(t);
});
n();
}, []);

React.useEffect(() => {
d();
}, []);

return <View style={styles.container} />;
}
Expand Down
Loading

0 comments on commit b3cdae2

Please sign in to comment.