Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
## 2026-05-12 - [Remove Duplicate Static Initialization & Unsafe String Operations]
**Learning:** The previous optimization attempt introduced a bug where 'cached_nodes' was initialized twice as different types (one array of xml_node pointers, one array of const char*). Moreover, directly casting const char* returned from pugixml without assigning to std::string when used in ternary operations can cause operand type mismatches.
**Action:** Removed the redundant array initialization block and cast the char* obtained via `pt.text().get()` from the single cached xml_node array to `std::string` inside the ternary conditional to prevent implicit conversion mismatches.

## 2026-06-18 - [Optimize String Concatenation in Loop/Method]
**Learning:** `std::string::append()` calls within repeatedly executed methods (like `vkt_turk_v_d` and `sat_turk_v_d` in the `zaman` class) cause the string to grow indefinitely. This not only incurs unnecessary memory allocation overhead leading to performance degradation, but also acts as a subtle memory leak and produces incorrect (concatenated) values over time.
**Action:** Always use direct assignment (`=`) instead of `.append()` when rebuilding strings that are meant to hold a single snapshot of data in a repeatedly called method.
45 changes: 20 additions & 25 deletions src/src-class/Zaman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,16 +111,7 @@ void zaman::vkt_h_v_d()
return nodes;
}();

static const char* cached_nodes[400] = {nullptr};
static bool cached_nodes_init = []() {
for (pugi::xml_node pt = cached_sehir.child("prayertimes"); pt; pt = pt.next_sibling("prayertimes")) {
int day = std::atoi(pt.attribute("dayofyear").value());
if (day >= 0 && day < 400) cached_nodes[day] = pt.text().get();
}
return true;
}();

zaman::xml_bu_gun = (zaman::h_rakam_gun_senenin >= 0 && zaman::h_rakam_gun_senenin < 400 && cached_nodes[zaman::h_rakam_gun_senenin]) ? cached_nodes[zaman::h_rakam_gun_senenin] : "";
zaman::xml_bu_gun = (zaman::h_rakam_gun_senenin >= 0 && zaman::h_rakam_gun_senenin < 400 && cached_nodes[zaman::h_rakam_gun_senenin]) ? std::string(cached_nodes[zaman::h_rakam_gun_senenin].text().get()) : "";

zaman::h_aksam = zaman::xml_bu_gun.substr(50, 6);
zaman::h_istibak_nucum = zaman::xml_bu_gun.substr(56, 6);
Expand All @@ -130,7 +121,7 @@ void zaman::vkt_h_v_d()
//buradaka kodları yeniliyoruz çünkü bir sonraki gün kılacağız verileri:

int next_day = zaman::h_rakam_gun_senenin + 1;
zaman::xml_bu_gun = (next_day >= 0 && next_day < 400 && cached_nodes[next_day]) ? cached_nodes[next_day] : "";
zaman::xml_bu_gun = (next_day >= 0 && next_day < 400 && cached_nodes[next_day]) ? std::string(cached_nodes[next_day].text().get()) : "";

zaman::h_imsak = zaman::xml_bu_gun.substr(0, 4) ;
zaman::h_sabah = zaman::xml_bu_gun.substr(5, 5) ;
Expand Down Expand Up @@ -177,19 +168,19 @@ void zaman::vkt_turk_v_d()
zaman::kible_saati_td = (1440 - zaman::h_aksam_td) + zaman::h_kible_saati_td ;

zaman::aksam = "00:00";
zaman::istibak_nucum.append( td_to_vakt(istibak_nucum_td) );
zaman::yatsi.append( td_to_vakt(yatsi_td) );
zaman::isa_sani.append( td_to_vakt(isa_sani_td) );
zaman::imsak.append( td_to_vakt(imsak_td) );
zaman::sabah.append( td_to_vakt(sabah_td) );
zaman::gunes.append( td_to_vakt(gunes_td) );
zaman::israk.append( td_to_vakt(israk_td) );
zaman::kerahet.append( td_to_vakt(kerahet_td) );
zaman::ogle.append( td_to_vakt(ogle_td) );
zaman::ikindi.append( td_to_vakt(ikindi_td) );
zaman::asr_sani.append( td_to_vakt(asr_sani_td) );
zaman::isfirar_sems.append( td_to_vakt(isfirar_sems_td) );
zaman::kible_saati.append( td_to_vakt(kible_saati_td) );
zaman::istibak_nucum = td_to_vakt(istibak_nucum_td);
zaman::yatsi = td_to_vakt(yatsi_td);
zaman::isa_sani = td_to_vakt(isa_sani_td);
zaman::imsak = td_to_vakt(imsak_td);
zaman::sabah = td_to_vakt(sabah_td);
zaman::gunes = td_to_vakt(gunes_td);
zaman::israk = td_to_vakt(israk_td);
zaman::kerahet = td_to_vakt(kerahet_td);
zaman::ogle = td_to_vakt(ogle_td);
zaman::ikindi = td_to_vakt(ikindi_td);
zaman::asr_sani = td_to_vakt(asr_sani_td);
zaman::isfirar_sems = td_to_vakt(isfirar_sems_td);
zaman::kible_saati = td_to_vakt(kible_saati_td);

};

Expand All @@ -208,7 +199,11 @@ void zaman::sat_turk_v_d()
zaman::dakika = int(( zaman::zaman_td / 60) % 60 ) ;
zaman::saniye = int(( zaman::zaman_td ) % 60) ;

zaman::simdiki_zaman_turk.append(std::to_string(zaman::saat) + ":" + std::to_string(zaman::dakika) + ":" + std::to_string(zaman::saniye));
// ⚡ Bolt Optimizasyonu: .append() kullanımı, bu metot her çağrıldığında
// (örneğin bir döngü içinde) string'in bellekte sonsuza kadar büyümesine
// ve ciddi bir performans düşüşüne (ve memory leak tarzı sızıntıya) sebep oluyordu.
// '=' ile direkt atama yapılarak bu engellendi ve performans artışı sağlandı.
zaman::simdiki_zaman_turk = std::to_string(zaman::saat) + ":" + std::to_string(zaman::dakika) + ":" + std::to_string(zaman::saniye);

};

Expand Down