View
@@ -5,6 +5,7 @@ TechEmpower Web Framework Benchmarks
<!--#declaration
#include "world.h"
static bson_t* query;
static UMongoDBClient* mc;
#ifndef AS_cpoll_cppsp_DO
@@ -31,6 +32,8 @@ static void usp_fork_mupdate()
return;
}
query = (bson_t*) U_SYSCALL_NO_PARAM(bson_new);
#ifndef AS_cpoll_cppsp_DO
U_NEW(UVector<World*>, pvworld_update, UVector<World*>(500));
#endif
@@ -43,6 +46,8 @@ static void usp_end_mupdate()
delete mc;
if (query) U_SYSCALL_VOID(bson_destroy, "%p", query);
#ifndef AS_cpoll_cppsp_DO
if (pvworld_update) delete pvworld_update;
#endif
@@ -58,18 +63,33 @@ uint32_t id, rnum;
int i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
#ifdef AS_cpoll_cppsp_DO
USP_PUTS_CHAR('[');
(void) UClientImage_Base::wbuffer->reserve(36U * num_queries);
char* s = UClientImage_Base::wbuffer->data();
char* ptr = UClientImage_Base::wbuffer->pend();
*ptr++ = '[';
#endif
while (true)
{
// mc->updateOneBulk(bulk, id = u_get_num_random(10000-1), "randomNumber", rnum = u_get_num_random(10000-1));
if (mc->findOne(id = u_get_num_random(10000-1)) &&
if (mc->findOne(id = u_get_num_random(10000-1), query) &&
mc->update( id, "randomNumber", rnum = u_get_num_random(10000-1)))
{
# ifdef AS_cpoll_cppsp_DO
USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", id, rnum);
u_put_unalignedp32(ptr, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(ptr+4, U_MULTICHAR_CONSTANT16('"',':'));
ptr = u_num2str32(id, ptr+6);
u_put_unalignedp64(ptr, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(ptr+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
ptr = u_num2str32(rnum, ptr+16);
*ptr++ = '}';
# else
World* pworld;
@@ -82,14 +102,16 @@ while (true)
if (++i == num_queries) break;
#ifdef AS_cpoll_cppsp_DO
USP_PUTS_CHAR(',');
*ptr++ = ',';
#endif
}
// (void) mc->executeBulk(bulk);
#ifdef AS_cpoll_cppsp_DO
USP_PUTS_CHAR(']');
*ptr++ = ']';
UClientImage_Base::wbuffer->size_adjust(ptr - s);
#else
USP_OBJ_JSON_stringify(*pvworld_update);
pvworld_update->clear();
View
@@ -28,7 +28,7 @@ static void usp_fork_query()
U_NEW(UOrmStatement, pstmt_query, UOrmStatement(*psql_query, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
if (UOrmDriver::isPGSQL()) *psql_query << "BEGIN TRANSACTION";
// if (UOrmDriver::isPGSQL()) *psql_query << "BEGIN TRANSACTION";
U_NEW(World, pworld_query, World);
View
@@ -5,14 +5,12 @@ TechEmpower Web Framework Benchmarks
<!--#declaration
#include "world.h"
static World* pworld_update;
static UOrmSession* psql_update;
static UOrmStatement* pstmt1;
static UOrmStatement* pstmt2;
#ifndef AS_cpoll_cppsp_DO
static bool bpgsql;
static World* pworld_update;
static UOrmSession* psql_update;
static UOrmStatement* pstmt;
static UOrmStatement* pstmt1;
static UVector<World*>* pvworld_update;
#endif
static void usp_fork_update()
{
@@ -27,20 +25,21 @@ static void usp_fork_update()
return;
}
U_NEW(UOrmStatement, pstmt1, UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
U_NEW(UOrmStatement, pstmt2, UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("UPDATE World SET randomNumber = ? WHERE id = ?")));
U_NEW(World, pworld_update, World);
U_NEW(UVector<World*>, pvworld_update, UVector<World*>(500));
if (UOrmDriver::isPGSQL()) *psql_update << "SET synchronous_commit TO OFF";
U_NEW(UOrmStatement, pstmt, UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
U_NEW(World, pworld_update, World);
pstmt->use( pworld_update->id);
pstmt->into(pworld_update->randomNumber);
pstmt1->use( pworld_update->id);
pstmt1->into(pworld_update->randomNumber);
pstmt2->use( pworld_update->randomNumber, pworld_update->id);
if ((bpgsql = UOrmDriver::isPGSQL()) == false)
{
U_NEW(UOrmStatement, pstmt1, UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("UPDATE World SET randomNumber = ? WHERE id = ?")));
#ifndef AS_cpoll_cppsp_DO
U_NEW(UVector<World*>, pvworld_update, UVector<World*>(500));
#endif
pstmt1->use(pworld_update->randomNumber, pworld_update->id);
}
// else *psql_update << "SET synchronous_commit TO OFF";
}
#ifdef DEBUG
@@ -50,16 +49,13 @@ static void usp_end_update()
delete psql_update;
if (pstmt1 &&
pstmt2)
if (pstmt)
{
delete pstmt1;
delete pstmt2;
delete pstmt;
delete pworld_update;
# ifndef AS_cpoll_cppsp_DO
delete pvworld_update;
# endif
if (bpgsql == false) delete pstmt1;
}
}
#endif
@@ -68,43 +64,102 @@ static void usp_end_update()
Content-Type: application/json
-->
<!--#code
char* ptr;
World* pworld;
char query[8192];
int i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
#ifdef AS_cpoll_cppsp_DO
USP_PUTS_CHAR('[');
#endif
if (bpgsql)
{
(void) memcpy(query, "UPDATE World SET randomNumber = v.randomNumber FROM (VALUES",
U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES"));
ptr = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
}
while (true)
{
pworld_update->id = u_get_num_random(10000-1);
pstmt1->execute();
pstmt->execute();
pworld_update->randomNumber = u_get_num_random(10000-1);
pstmt2->execute();
#ifdef AS_cpoll_cppsp_DO
USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", pworld_update->id, pworld_update->randomNumber);
#else
World* pworld;
if (bpgsql == false) pstmt1->execute();
U_NEW(World, pworld, World(*pworld_update));
pvworld_update->push_back(pworld);
if (++i == num_queries) break;
}
#ifdef AS_cpoll_cppsp_DO
(void) UClientImage_Base::wbuffer->reserve(36U * num_queries);
char* s = UClientImage_Base::wbuffer->data();
char* p = UClientImage_Base::wbuffer->pend();
*p++ = '[';
#endif
if (bpgsql) pvworld_update->sort(World::cmp_obj);
i = 0;
while (true)
{
if (bpgsql)
{
pworld = pvworld_update->at(i);
*ptr++ = '(';
ptr = u_num2str32(pworld->id, ptr);
*ptr++ = ',';
ptr = u_num2str32(pworld->randomNumber, ptr);
u_put_unalignedp16(ptr, U_MULTICHAR_CONSTANT16(')',','));
ptr += 2;
}
#ifdef AS_cpoll_cppsp_DO
u_put_unalignedp32(p, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(p+4, U_MULTICHAR_CONSTANT16('"',':'));
p = u_num2str32(pworld->id, p+6);
u_put_unalignedp64(p, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(p+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
p = u_num2str32(pworld->randomNumber, p+16);
*p++ = '}';
#endif
if (++i == num_queries) break;
#ifdef AS_cpoll_cppsp_DO
USP_PUTS_CHAR(',');
*p++ = ',';
#endif
}
#ifdef AS_cpoll_cppsp_DO
USP_PUTS_CHAR(']');
*p++ = ']';
UClientImage_Base::wbuffer->size_adjust(p - s);
#else
USP_OBJ_JSON_stringify(*pvworld_update);
pvworld_update->clear();
#endif
pvworld_update->clear();
if (bpgsql)
{
(void) memcpy(ptr-1, ") AS v (id,randomNumber) WHERE World.id = v.id;",
U_CONSTANT_SIZE(") AS v (id,randomNumber) WHERE World.id = v.id;")+1);
if (psql_update->query(query, ptr + U_CONSTANT_SIZE(") AS v (id,randomNumber) WHERE World.id = v.id;") - query) == false) UHTTP::setInternalError();
}
-->
View
@@ -32,6 +32,13 @@ class World {
U_TRACE_REGISTER_OBJECT(5, World, "%u,%u", _id, _randomNumber)
}
World(const World& w) : id(w.id), randomNumber(w.randomNumber)
{
U_TRACE_REGISTER_OBJECT(5, World, "%p", &w)
U_MEMORY_TEST_COPY(w)
}
~World()
{
U_TRACE_UNREGISTER_OBJECT(5, World)
@@ -73,6 +80,30 @@ class World {
stmt->bindResult(U_ORM_TYPE_HANDLER(randomNumber, unsigned int));
}
// SERVICE
bool operator<(const World& other) const { return cmp_obj(&id, &other.id); }
static int cmp_obj(const void* a, const void* b)
{
U_TRACE(5, "World::cmp_obj(%p,%p)", a, b)
# ifdef U_STDCPP_ENABLE
/**
* The comparison function must follow a strict-weak-ordering
*
* 1) For all x, it is not the case that x < x (irreflexivity)
* 2) For all x, y, if x < y then it is not the case that y < x (asymmetry)
* 3) For all x, y, and z, if x < y and y < z then x < z (transitivity)
* 4) For all x, y, and z, if x is incomparable with y, and y is incomparable with z, then x is incomparable with z (transitivity of incomparability)
*/
return (((const World*)a)->id < (((const World*)b)->id));
# else
return (*(const World**)a)->id < ((*(const World**)b)->id);
# endif
}
#ifdef DEBUG
const char* dump(bool breset) const
{