Skip to content

Commit

Permalink
optimize _NOCAST() calls in performance-critical regions
Browse files Browse the repository at this point in the history
  • Loading branch information
bhaller committed Dec 29, 2023
1 parent f949f1d commit 7b96364
Show file tree
Hide file tree
Showing 14 changed files with 294 additions and 161 deletions.
16 changes: 14 additions & 2 deletions core/chromosome.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -912,11 +912,23 @@ Mutation *Chromosome::ApplyMutationCallbacks(Mutation *p_mut, Genome *p_genome,

if ((resultType == EidosValueType::kValueLogical) && (resultCount == 1))
{
mutation_accepted = result->LogicalAtIndex_NOCAST(0, nullptr);
#if DEBUG
// this checks the value type at runtime
mutation_accepted = result->LogicalData()[0];
#else
// unsafe cast for speed
mutation_accepted = ((EidosValue_Logical *)result)->data()[0];
#endif
}
else if ((resultType == EidosValueType::kValueObject) && (((EidosValue_Object *)result)->Class() == gSLiM_Mutation_Class) && (resultCount == 1))
{
Mutation *replacementMutation = (Mutation *)result->ObjectElementAtIndex_NOCAST(0, mutation_callback->identifier_token_);
#if DEBUG
// this checks the value type at runtime
Mutation *replacementMutation = (Mutation *)result->ObjectData()[0];
#else
// unsafe cast for speed
Mutation *replacementMutation = (Mutation *)((EidosValue_Object *)result)->data()[0];
#endif

if (replacementMutation == p_mut)
{
Expand Down
18 changes: 12 additions & 6 deletions core/community_eidos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -720,11 +720,12 @@ EidosValue_SP Community::ExecuteMethod_genomicElementTypesWithIDs(EidosGlobalStr
#pragma unused (p_method_id, p_interpreter)
EidosValue *ids_value = p_arguments[0].get();
int ids_count = ids_value->Count();
const int64_t *ids_data = ids_value->IntData();
EidosValue_Object *vec = (new (gEidosValuePool->AllocateChunk()) EidosValue_Object(gSLiM_GenomicElementType_Class))->resize_no_initialize_RR(ids_count);

for (int id_index = 0; id_index < ids_count; id_index++)
{
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_value->IntAtIndex_NOCAST(id_index, nullptr));
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_data[id_index]);
GenomicElementType *object = GenomicElementTypeWithID(id);

if (!object)
Expand All @@ -743,11 +744,12 @@ EidosValue_SP Community::ExecuteMethod_interactionTypesWithIDs(EidosGlobalString
#pragma unused (p_method_id, p_interpreter)
EidosValue *ids_value = p_arguments[0].get();
int ids_count = ids_value->Count();
const int64_t *ids_data = ids_value->IntData();
EidosValue_Object *vec = (new (gEidosValuePool->AllocateChunk()) EidosValue_Object(gSLiM_InteractionType_Class))->resize_no_initialize_RR(ids_count);

for (int id_index = 0; id_index < ids_count; id_index++)
{
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_value->IntAtIndex_NOCAST(id_index, nullptr));
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_data[id_index]);
InteractionType *object = InteractionTypeWithID(id);

if (!object)
Expand All @@ -766,11 +768,12 @@ EidosValue_SP Community::ExecuteMethod_mutationTypesWithIDs(EidosGlobalStringID
#pragma unused (p_method_id, p_interpreter)
EidosValue *ids_value = p_arguments[0].get();
int ids_count = ids_value->Count();
const int64_t *ids_data = ids_value->IntData();
EidosValue_Object *vec = (new (gEidosValuePool->AllocateChunk()) EidosValue_Object(gSLiM_MutationType_Class))->resize_no_initialize_RR(ids_count);

for (int id_index = 0; id_index < ids_count; id_index++)
{
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_value->IntAtIndex_NOCAST(id_index, nullptr));
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_data[id_index]);
MutationType *object = MutationTypeWithID(id);

if (!object)
Expand All @@ -789,11 +792,12 @@ EidosValue_SP Community::ExecuteMethod_scriptBlocksWithIDs(EidosGlobalStringID p
#pragma unused (p_method_id, p_interpreter)
EidosValue *ids_value = p_arguments[0].get();
int ids_count = ids_value->Count();
const int64_t *ids_data = ids_value->IntData();
EidosValue_Object *vec = (new (gEidosValuePool->AllocateChunk()) EidosValue_Object(gSLiM_SLiMEidosBlock_Class))->resize_no_initialize_RR(ids_count);

for (int id_index = 0; id_index < ids_count; id_index++)
{
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_value->IntAtIndex_NOCAST(id_index, nullptr));
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_data[id_index]);
SLiMEidosBlock *object = ScriptBlockWithID(id);

if (!object)
Expand All @@ -812,11 +816,12 @@ EidosValue_SP Community::ExecuteMethod_speciesWithIDs(EidosGlobalStringID p_meth
#pragma unused (p_method_id, p_interpreter)
EidosValue *ids_value = p_arguments[0].get();
int ids_count = ids_value->Count();
const int64_t *ids_data = ids_value->IntData();
EidosValue_Object *vec = (new (gEidosValuePool->AllocateChunk()) EidosValue_Object(gSLiM_Species_Class))->resize_no_initialize_RR(ids_count);

for (int id_index = 0; id_index < ids_count; id_index++)
{
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_value->IntAtIndex_NOCAST(id_index, nullptr));
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_data[id_index]);
Species *object = SpeciesWithID(id);

if (!object)
Expand All @@ -835,11 +840,12 @@ EidosValue_SP Community::ExecuteMethod_subpopulationsWithIDs(EidosGlobalStringID
#pragma unused (p_method_id, p_interpreter)
EidosValue *ids_value = p_arguments[0].get();
int ids_count = ids_value->Count();
const int64_t *ids_data = ids_value->IntData();
EidosValue_Object *vec = (new (gEidosValuePool->AllocateChunk()) EidosValue_Object(gSLiM_Subpopulation_Class))->resize_no_initialize_RR(ids_count);

for (int id_index = 0; id_index < ids_count; id_index++)
{
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_value->IntAtIndex_NOCAST(id_index, nullptr));
slim_objectid_t id = SLiMCastToObjectidTypeOrRaise(ids_data[id_index]);
Subpopulation *object = SubpopulationWithID(id);

if (!object)
Expand Down
Loading

0 comments on commit 7b96364

Please sign in to comment.