diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/lltexturefetch.cpp | 4 | ||||
-rw-r--r-- | indra/newview/llviewerassetstats.cpp | 60 | ||||
-rw-r--r-- | indra/newview/tests/llviewerassetstats_test.cpp | 228 |
3 files changed, 271 insertions, 21 deletions
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 2be3ba3280..f5e2e35e1e 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2659,7 +2659,6 @@ void LLTextureFetch::commandSetRegion(const LLUUID & region_id) TFReqSetRegion * req = new TFReqSetRegion(region_id); cmdEnqueue(req); - LL_INFOS("Texture") << "COMMANDING SET REGION" << LL_ENDL; } void LLTextureFetch::commandSendMetrics(const std::string & caps_url, @@ -2821,7 +2820,6 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher) LLViewerAssetStatsFF::merge_stats(main_stats, thread1_stats); // *TODO: Consider putting a report size limiter here. - LL_INFOS("Texture") << "PROCESSING SENDMETRICS REQUEST" << LL_ENDL; if (! mCapsURL.empty()) { LLCurlRequest::headers_t headers; @@ -2839,7 +2837,7 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher) // In QA mode, Metrics submode, log the result for ease of testing if (fetcher->isQAMode()) { - LL_INFOS("QAViewerMetrics") << thread1_stats << LL_ENDL; + LL_INFOS("Textures") << thread1_stats << LL_ENDL; } gViewerAssetStatsThread1->reset(); diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index 3d7f9f932f..502a3aa340 100644 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp @@ -263,19 +263,19 @@ LLViewerAssetStats::asLLSD() slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount())); slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount())); slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount())); - slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin())); - slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax())); - slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean())); + slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6)); + slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6)); + slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6)); } - reg_stat["duration"] = LLSD::Integer(stats.mTotalTime / 1000000); + reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6); regions[it->first.asString()] = reg_stat; } LLSD ret = LLSD::emptyMap(); ret["regions"] = regions; - ret["duration"] = LLSD::Integer((now - mResetTimestamp) / 1000000); + ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6); return ret; } @@ -290,12 +290,12 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst) static const int MOP_MEAN_REAL(3); // Requires a 'mMergeOpArg' to weight the input terms static const LLSD::String regions_key("regions"); + static const LLSD::String resp_count_key("resp_count"); static const struct { LLSD::String mName; int mMergeOp; - LLSD::String mMergeOpArg; } key_list[] = { @@ -305,12 +305,12 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst) // is modified or the weight will be wrong. Key list is // defined in asLLSD() and must track it. - { "resp_mean", MOP_MEAN_REAL, "resp_count" }, - { "enqueued", MOP_ADD_INT, "" }, - { "dequeued", MOP_ADD_INT, "" }, - { "resp_count", MOP_ADD_INT, "" }, - { "resp_min", MOP_MIN_REAL, "" }, - { "resp_max", MOP_MAX_REAL, "" } + { "resp_mean", MOP_MEAN_REAL }, + { "enqueued", MOP_ADD_INT }, + { "dequeued", MOP_ADD_INT }, + { "resp_min", MOP_MIN_REAL }, + { "resp_max", MOP_MAX_REAL }, + { resp_count_key, MOP_ADD_INT } // Keep last }; // Trivial checks @@ -368,6 +368,10 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst) LLSD & bin_dst(reg_dst[it_sets->first]); const LLSD & bin_src(reg_src[it_sets->first]); + // The "resp_count" value is needed repeatedly in operations. + const LLSD::Integer bin_src_count(bin_src[resp_count_key].asInteger()); + const LLSD::Integer bin_dst_count(bin_dst[resp_count_key].asInteger()); + for (int key_index(0); key_index < LL_ARRAY_SIZE(key_list); ++key_index) { const LLSD::String & key_name(key_list[key_index].mName); @@ -395,25 +399,45 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst) case MOP_ADD_INT: // Simple counts, just add dst_value = dst_value.asInteger() + src_value.asInteger(); - break; case MOP_MIN_REAL: // Minimum - dst_value = llmin(dst_value.asReal(), src_value.asReal()); + if (bin_src_count) + { + // If src has non-zero count, it's min is meaningful + if (bin_dst_count) + { + dst_value = llmin(dst_value.asReal(), src_value.asReal()); + } + else + { + dst_value = src_value; + } + } break; case MOP_MAX_REAL: // Maximum - dst_value = llmax(dst_value.asReal(), src_value.asReal()); + if (bin_src_count) + { + // If src has non-zero count, it's max is meaningful + if (bin_dst_count) + { + dst_value = llmax(dst_value.asReal(), src_value.asReal()); + } + else + { + dst_value = src_value; + } + } break; case MOP_MEAN_REAL: { // Mean - const LLSD::String & weight_key(key_list[key_index].mMergeOpArg); - F64 src_weight(bin_src[weight_key].asReal()); - F64 dst_weight(bin_dst[weight_key].asReal()); + F64 src_weight(bin_src_count); + F64 dst_weight(bin_dst_count); F64 tot_weight(src_weight + dst_weight); if (tot_weight >= F64(0.5)) { diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index a44712e8ad..8bedd2c860 100644 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp @@ -518,4 +518,232 @@ namespace tut ensure_approximately_equals("weighted mean of means", dst["regions"][reg1_name]["get_other"]["resp_mean"].asReal(), 2.7901295, 20); } } + + // Maximum merges are interesting when one side contributes nothing + template<> template<> + void tst_viewerassetstats_index_object_t::test<10>() + { + LLSD::String reg1_name = region1.asString(); + LLSD::String reg2_name = region2.asString(); + + LLSD reg1_stats = LLSD::emptyMap(); + LLSD reg2_stats = LLSD::emptyMap(); + + LLSD & tmp_other1 = reg1_stats["get_other"]; + tmp_other1["enqueued"] = 4; + tmp_other1["dequeued"] = 4; + tmp_other1["resp_count"] = 7; + tmp_other1["resp_max"] = F64(-23.2892); + tmp_other1["resp_min"] = F64(-123.2892); + tmp_other1["resp_mean"] = F64(-58.28298); + + LLSD & tmp_other2 = reg2_stats["get_other"]; + tmp_other2["enqueued"] = 8; + tmp_other2["dequeued"] = 7; + tmp_other2["resp_count"] = 0; + tmp_other2["resp_max"] = F64(0); + tmp_other2["resp_min"] = F64(0); + tmp_other2["resp_mean"] = F64(0); + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg1_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg2_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("dst maximum with count 0 does not contribute to merged maximum", + dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20); + } + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg2_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg1_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("src maximum with count 0 does not contribute to merged maximum", + dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20); + } + } + + // Minimum merges are interesting when one side contributes nothing + template<> template<> + void tst_viewerassetstats_index_object_t::test<11>() + { + LLSD::String reg1_name = region1.asString(); + LLSD::String reg2_name = region2.asString(); + + LLSD reg1_stats = LLSD::emptyMap(); + LLSD reg2_stats = LLSD::emptyMap(); + + LLSD & tmp_other1 = reg1_stats["get_other"]; + tmp_other1["enqueued"] = 4; + tmp_other1["dequeued"] = 4; + tmp_other1["resp_count"] = 7; + tmp_other1["resp_max"] = F64(123.2892); + tmp_other1["resp_min"] = F64(23.2892); + tmp_other1["resp_mean"] = F64(58.28298); + + LLSD & tmp_other2 = reg2_stats["get_other"]; + tmp_other2["enqueued"] = 8; + tmp_other2["dequeued"] = 7; + tmp_other2["resp_count"] = 0; + tmp_other2["resp_max"] = F64(0); + tmp_other2["resp_min"] = F64(0); + tmp_other2["resp_mean"] = F64(0); + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg1_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg2_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("dst minimum with count 0 does not contribute to merged minimum", + dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20); + } + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg2_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg1_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("src minimum with count 0 does not contribute to merged minimum", + dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20); + } + } + + // resp_count missing is taken as '0' for maximum calculation + template<> template<> + void tst_viewerassetstats_index_object_t::test<12>() + { + LLSD::String reg1_name = region1.asString(); + LLSD::String reg2_name = region2.asString(); + + LLSD reg1_stats = LLSD::emptyMap(); + LLSD reg2_stats = LLSD::emptyMap(); + + LLSD & tmp_other1 = reg1_stats["get_other"]; + tmp_other1["enqueued"] = 4; + tmp_other1["dequeued"] = 4; + tmp_other1["resp_count"] = 7; + tmp_other1["resp_max"] = F64(-23.2892); + tmp_other1["resp_min"] = F64(-123.2892); + tmp_other1["resp_mean"] = F64(-58.28298); + + LLSD & tmp_other2 = reg2_stats["get_other"]; + tmp_other2["enqueued"] = 8; + tmp_other2["dequeued"] = 7; + // tmp_other2["resp_count"] = 0; + tmp_other2["resp_max"] = F64(0); + tmp_other2["resp_min"] = F64(0); + tmp_other2["resp_mean"] = F64(0); + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg1_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg2_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("dst maximum with undefined count does not contribute to merged maximum", + dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20); + } + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg2_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg1_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("src maximum with undefined count does not contribute to merged maximum", + dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20); + } + } + + // resp_count unspecified is taken as 0 for minimum merges + template<> template<> + void tst_viewerassetstats_index_object_t::test<13>() + { + LLSD::String reg1_name = region1.asString(); + LLSD::String reg2_name = region2.asString(); + + LLSD reg1_stats = LLSD::emptyMap(); + LLSD reg2_stats = LLSD::emptyMap(); + + LLSD & tmp_other1 = reg1_stats["get_other"]; + tmp_other1["enqueued"] = 4; + tmp_other1["dequeued"] = 4; + tmp_other1["resp_count"] = 7; + tmp_other1["resp_max"] = F64(123.2892); + tmp_other1["resp_min"] = F64(23.2892); + tmp_other1["resp_mean"] = F64(58.28298); + + LLSD & tmp_other2 = reg2_stats["get_other"]; + tmp_other2["enqueued"] = 8; + tmp_other2["dequeued"] = 7; + // tmp_other2["resp_count"] = 0; + tmp_other2["resp_max"] = F64(0); + tmp_other2["resp_min"] = F64(0); + tmp_other2["resp_mean"] = F64(0); + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg1_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg2_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("dst minimum with undefined count does not contribute to merged minimum", + dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20); + } + + { + LLSD src = LLSD::emptyMap(); + LLSD dst = LLSD::emptyMap(); + + src["regions"][reg1_name] = reg2_stats; + src["duration"] = 24; + dst["regions"][reg1_name] = reg1_stats; + dst["duration"] = 36; + + LLViewerAssetStats::mergeRegionsLLSD(src, dst); + + ensure_approximately_equals("src minimum with undefined count does not contribute to merged minimum", + dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20); + } + } } |