Profiler
PoSDK includes a high-performance code execution monitoring tool that helps developers identify performance bottlenecks in program execution.
What is a Performance Label?
Label is an attribute tag for code segments, used to track the performance of different functions or code blocks. It’s like attaching name tags to code blocks, making it easy to see which parts run fast or slow.
For example:
"feature_extraction"- marks feature detection code segments"image_matching"- marks image matching algorithm code segments"triangulation_reconstruction"- marks 3D point reconstruction code segments
Basic Usage
1. Automatic Function Performance Measurement
void FeatureExtractionFunction()
{
PROFILER_START_AUTO(true); // Automatically use function name as label for performance measurement
// Your feature extraction code...
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
2. Measure Specific Code Segment Performance
void ImageProcessingFunction()
{
PROFILER_START_AUTO(true);
// Measure image preprocessing section
InitializeData();
PROFILER_STAGE("image_preprocessing");
// Measure feature detection section
ExtractFeatures();
PROFILER_STAGE("SIFT_feature_detection");
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
3. Enable Profiler and View Results
int main()
{
// Enable performance profiler (for specific methods)
PM_SET_PROFILING_ENABLED("my_algorithm", true);
// Run your program
FeatureExtractionFunction();
ImageProcessingFunction();
// Generate performance report file
PM_EXPORT_TO_CSV("performance_report.csv");
// Or print directly to console for viewing
PM_DISPLAY_ALL_PROFILING_DATA();
return 0;
}
Performance Report Output Examples
After running the above code, you will see performance statistics similar to the following:
Console Output
=== FeatureExtractionFunction Current Session Performance Statistics ===
Duration: 125.43 ms
Memory Increment: 34.2 MB (relative to start)
CPU Usage: 187.4%
Thread Count (start/end): 1/4
=== Stage Interval Statistics ===
START_to_image_preprocessing: 34.21 ms
image_preprocessing_to_SIFT_feature_detection: 55.46 ms
SIFT_feature_detection_to_END: 35.76 ms
CSV File Output (performance_report.csv)
Label Name (label_str) |
Session Count |
Total Execution Time (ms) |
Average Time (ms) |
Min Time (ms) |
Max Time (ms) |
Peak Memory (MB) |
Average CPU (%) |
|---|---|---|---|---|---|---|---|
FeatureExtractionFunction |
1 |
125.43 |
125.43 |
125.43 |
125.43 |
34.2 |
187.4 |
ImageProcessingFunction |
1 |
89.67 |
89.67 |
89.67 |
89.67 |
28.1 |
156.8 |
Table Description:
Label Name: The label string (label_str) you set in your code
Session Count: How many times this code segment was executed
Total Execution Time: How long this code segment has accumulated in total
Average Time: Average execution time per run
Peak Memory: Maximum memory increment relative to start during this code segment’s execution
Average CPU: Average CPU usage rate for this code segment
Advanced Usage Tips
Using Different Performance Metrics
void DataProcessingFunction()
{
// Time only (fastest, suitable for frequently called functions)
POSDK_START(true, "time");
// Time + memory statistics (suitable for memory-sensitive algorithms)
POSDK_START(true, "time|memory");
// Complete statistics (time + memory + CPU + thread count)
POSDK_START(true, "time|memory|cpu");
// Your algorithm code...
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
Monitoring External Program Performance
void CallExternalTool()
{
PROFILER_START_AUTO(true);
// Automatically monitor subprocess resource usage when executing external programs
int result = POSDK_SYSTEM("python train_model.py --epochs 100");
PROFILER_END();
PROFILER_PRINT_STATS(true); // Will display total resource consumption including subprocesses
}
Experiment Comparison Analysis
void AlgorithmComparisonExperiment()
{
// Experiment 1: Basic algorithm
std::unordered_map<std::string, std::string> labels1 = {
{"algorithm_type", "basic_sfm"},
{"dataset", "indoor_scene"},
{"experiment_batch", "2025_01"}
};
PROFILER_START_STRUCTURED(labels1, true);
RunBasicAlgorithm();
PROFILER_END();
// Experiment 2: Improved algorithm
std::unordered_map<std::string, std::string> labels2 = {
{"algorithm_type", "improved_sfm"},
{"dataset", "indoor_scene"},
{"experiment_batch", "2025_01"}
};
PROFILER_START_STRUCTURED(labels2, true);
RunImprovedAlgorithm();
PROFILER_END();
// Export comparison results to CSV for Excel analysis
PM_EXPORT_TO_CSV("algorithm_comparison_results.csv");
}
Practical Recommendations
Use meaningful label names: Use descriptive names such as “feature_matching”, “pose_estimation”, etc.
Measure key code segments: Focus on algorithms and loops that may be time-consuming
Review reports regularly: Use performance reports to identify program bottlenecks and optimize the most time-consuming parts
Can be disabled in release: Performance profiling can be disabled via compile options in final release versions to avoid affecting runtime speed
Choose appropriate metrics: For frequently called functions, only track time; for memory-sensitive algorithms, add memory monitoring
System Configuration
The profiler is disabled by default and needs to be manually enabled:
// Enable profiler for specific methods
PM_SET_PROFILING_ENABLED("my_algorithm", true);
// Check if enabled
bool profiler_enabled = PM_IS_PROFILING_ENABLED("my_algorithm");
// Clear historical statistics
PM_CLEAR();
This way, developers can easily monitor code performance, identify program execution bottlenecks, and optimize code to improve overall performance.
Complete Function and Macro Reference
ProfilerManager Core Functions
GetInstance()
Get ProfilerManager singleton instance
static ProfilerManager &GetInstance();
Return Value: ProfilerManager & - Reference to singleton instance
Usage Example:
auto& manager = ProfilerManager::GetInstance();
manager.SetProfilingEnabled("my_algorithm", true);
IsProfilingEnabled()
Check if performance profiling is enabled for a method type
bool IsProfilingEnabled(const std::string &method_type) const;
Parameters:
method_typeconst std::string &: Method type to check
Return Value: bool - Returns true if performance profiling is enabled
SetProfilingEnabled()
Enable or disable performance profiling for a method type
void SetProfilingEnabled(const std::string &method_type, bool enabled);
Parameters:
method_typeconst std::string &: Method typeenabledbool: Whether to enable performance profiling
SubmitSessionData()
Submit completed performance profiling session data
void SubmitSessionData(const ProfilerInfo &session_data);
Parameters:
session_dataconst ProfilerInfo &: Complete session data
Note: This is the only function that modifies global state, called once per session
GetTotalProfilerInfo()
Get accumulated performance profiling data for a label
TotalProfilerInfo GetTotalProfilerInfo(const std::string &label_str) const;
Parameters:
label_strconst std::string &: Profiling label
Return Value: TotalProfilerInfo - Copy of accumulated performance profiling data
DisplayAllProfilingData()
Display all accumulated performance profiling data
void DisplayAllProfilingData() const;
Note: Displays performance statistics for all analyzed sessions
ExportToCSV()
Export performance profiling data to CSV file
bool ExportToCSV(const std::string &file_path) const;
Parameters:
file_pathconst std::string &: CSV file path
Return Value: bool - Returns true if export succeeds
Clear()
Clear all performance profiling data
void Clear();
Note: Resets all accumulated statistics
ProfilerSession Core Functions
IsActive()
Check if session is active
bool IsActive() const;
Return Value: bool - Returns true if session is active
IsMetricsEnabled()
Check if a specific metric type is enabled
bool IsMetricsEnabled(MetricsType type) const;
Parameters:
typeMetricsType: Metric type to check
Return Value: bool - Returns true if enabled
IsSubprocessMonitoringEnabled()
Check if subprocess monitoring is enabled
bool IsSubprocessMonitoringEnabled() const;
Return Value: bool - Returns true if enabled
EnableSubprocessMonitoring()
Dynamically enable subprocess monitoring
void EnableSubprocessMonitoring();
Note: Switch from current process monitoring to process tree monitoring
DisableSubprocessMonitoring()
Disable subprocess monitoring
void DisableSubprocessMonitoring();
Note: Temporarily disable subprocess monitoring without changing other metrics
AddStageCheckpoint()
Add intelligent stage checkpoint
void AddStageCheckpoint(const std::string &stage_name);
Parameters:
stage_nameconst std::string &: Stage name
Note: Automatically captures performance metrics at this checkpoint (lock-free operation)
GetSessionData()
Get copy of current session data
ProfilerInfo GetSessionData() const;
Return Value: ProfilerInfo - Copy of current session data
Note: Returns a copy of session_data_ for use after session ends
NotifySubprocessStartup()
Notify session that subprocess has started
void NotifySubprocessStartup(const std::string &command);
Parameters:
commandconst std::string &: Command being executed
Note: Triggers immediate sampling when subprocess starts
ExecuteSystemCommand()
Execute system command with profiling awareness
int ExecuteSystemCommand(const std::string &command);
Parameters:
commandconst std::string &: Command to execute
Return Value: int - Command exit code
Note: Automatically triggers subprocess monitoring if enabled
Profiler Macro Detailed Reference
PROFILER_START_AUTO()
Start performance profiling session for current method and automatically select label
#define PROFILER_START_AUTO(enable_profiling)
Parameters:
enable_profilingbool: Whether to enable performance profiling
Notes:
Must be called in a method that inherits from MethodPresetProfiler
Automatically uses structured labels or string labels from the method
By default only tracks time to save overhead
Usage Example:
PROFILER_START_AUTO(true); // Automatically use method-configured labels
PROFILER_START()
Start performance profiling session with string label (lock-free)
#define PROFILER_START(label_str, enable_profiling)
Parameters:
label_strconst char*/std::string: Profiling label stringenable_profilingbool: Whether to enable performance profiling
Note: Creates lock-free session with specified string label
Usage Example:
PROFILER_START("experiment_1", true); // Create "experiment_1" session
POSDK_START()
Start performance profiling session with configurable metrics (lock-free)
// Single parameter version (default metrics is "time")
#define POSDK_START(enable_profiling)
// Two parameter version
#define POSDK_START(enable_profiling, metrics_config)
Parameters:
enable_profilingbool: Whether to enable performance profilingmetrics_configconst char*/std::string: Metrics configuration string (optional, default “time”)
Supported Metric Configurations:
"time"- Track time only"time|memory"- Time + memory"time|memory|cpu"- Time + memory + CPU"ALL"- All metrics
Usage Example:
POSDK_START(true); // Default: time only
POSDK_START(true, "time|memory"); // Time + memory
POSDK_START(true, "time|memory|cpu"); // Time + memory + CPU
PROFILER_START_STRUCTURED()
Start performance profiling session with structured labels (lock-free)
#define PROFILER_START_STRUCTURED(structured_labels, enable_profiling)
Parameters:
structured_labelsstd::unordered_map<std::string, std::string>: Structured label mappingenable_profilingbool: Whether to enable performance profiling
Usage Example:
std::unordered_map<std::string, std::string> labels = {
{"pipeline", "PoSDK"},
{"dataname", "test_data1"}
};
PROFILER_START_STRUCTURED(labels, true);
PROFILER_START_WITH_METRICS()
Start performance profiling session with specific metrics (lock-free)
#define PROFILER_START_WITH_METRICS(label_str, enable_profiling, metrics_config)
Parameters:
label_strconst char*/std::string: Profiling label stringenable_profilingbool: Whether to enable performance profilingmetrics_configconst char*/std::string: Metrics configuration string
PROFILER_START_WITH_SUBPROCESS()
Start performance profiling session with subprocess monitoring (lock-free)
#define PROFILER_START_WITH_SUBPROCESS(label_str, enable_profiling)
Parameters:
label_strconst char*/std::string: Profiling label stringenable_profilingbool: Whether to enable performance profiling
Note: Monitors current process + all subprocesses (e.g., external executables like COLMAP, GLOMAP)
Usage Example:
PROFILER_START_WITH_SUBPROCESS("glomap_pipeline", true); // Include colmap+glomap resource usage
PROFILER_END()
End performance profiling session (lock-free)
#define PROFILER_END()
Notes:
Automatically called when profiler_session goes out of scope
Saves session data to _current_profiler_info
PROFILER_STAGE()
Intelligent stage checkpoint (lock-free)
#define PROFILER_STAGE(stage_name)
Parameters:
stage_nameconst char*/std::string: Stage name for automatic interval analysis
Notes:
Automatically measures performance metrics from the previous checkpoint to the current stage (lock-free operation)
Calculates intervals: [START, STAGE1], [STAGE1, STAGE2], …, [STAGEn, END]
Usage Example:
PROFILER_STAGE("initialization"); // Measure [START, initialization]
PROFILER_STAGE("computation"); // Measure [initialization, computation]
PROFILER_STAGE("finalization"); // Measure [computation, finalization]
PROFILER_END(); // Measure [finalization, END]
PROFILER_SCOPE()
Automatic performance profiler for entire method scope (lock-free)
#define PROFILER_SCOPE(enable_profiling)
Parameters:
enable_profilingbool: Whether to enable performance profiling
Notes:
Creates RAII performance profiling session that automatically ends when scope exits
Use this macro at the beginning of Run() method for complete method performance analysis
Automatically uses labels from GetProfilerLabel()/GetProfilerLabels()
Usage Example:
PROFILER_SCOPE(true); // Use method-configured labels
POSDK_SYSTEM()
Execute system command with optional subprocess monitoring
// Single parameter version (subprocess monitoring disabled by default)
#define POSDK_SYSTEM(command)
// Two parameter version
#define POSDK_SYSTEM(command, enable_subprocess_monitoring)
Parameters:
commandconst char*/std::string: Command string to executeenable_subprocess_monitoringbool: Whether to enable subprocess monitoring (optional, default false)
Return Value: int - Command exit code
Notes:
When an active ProfilerSession exists, uses the session’s metric configuration
If enable_subprocess_monitoring=true, temporarily enables subprocess monitoring
Usage Example:
int result = POSDK_SYSTEM("./command"); // Use session metrics, no subprocess monitoring
int result = POSDK_SYSTEM("./command", true); // Use session metrics + subprocess monitoring
POSDK_SYSTEM_AUTO()
Execute system command with automatic performance profiling session management
#define POSDK_SYSTEM_AUTO(command, enable_profiling)
Parameters:
commandconst char*/std::string: Command string to executeenable_profilingbool: Whether to enable performance profiling
Return Value: int - Command exit code
Notes:
Automatically creates a ProfilerSession that tracks time only, executes command, and ends session
Equivalent to: PROFILER_START_AUTO + POSDK_SYSTEM + PROFILER_END
Uses session’s metric configuration, subprocess monitoring disabled by default
Usage Example:
int result = POSDK_SYSTEM_AUTO("./intensive_workload 3 150 2 4 2", true); // Complete performance profiling session
PROFILER_PRINT_STATS()
Print current session’s performance profiling statistics
#define PROFILER_PRINT_STATS(enable_profiling)
Parameters:
enable_profilingbool: Whether performance profiling is enabled
Notes:
Prints current session data from _current_profiler_info
Must be called after PROFILER_END()
Usage Example:
PROFILER_PRINT_STATS(true);
PM_PRINT_STATS()
Print accumulated performance statistics from ProfilerManager
#define PM_PRINT_STATS(label_str, enable_profiling)
Parameters:
label_strconst char*/std::string: Profiling label to queryenable_profilingbool: Whether performance profiling is enabled
Note: Prints accumulated performance profiling data for the specified label in ProfilerManager
Usage Example:
PM_PRINT_STATS("core_build_time", true);
PROFILER_GET_CURRENT_TIME()
Get current session duration
#define PROFILER_GET_CURRENT_TIME(enable_profiling)
Parameters:
enable_profilingbool: Whether performance profiling is enabled
Return Value: double - Current session duration (milliseconds), returns 0.0 if unavailable
Notes:
Returns duration from _current_profiler_info
Must be called after PROFILER_END()
PM_GET_AVG_TIME()
Get accumulated average duration from ProfilerManager
#define PM_GET_AVG_TIME(label_str, enable_profiling)
Parameters:
label_strconst char*/std::string: Profiling label to queryenable_profilingbool: Whether performance profiling is enabled
Return Value: double - Average duration (milliseconds), returns 0.0 if no data
Note: Returns accumulated average duration for all sessions of the specified label
Performance Metrics Description
Time Metric (TIME)
Measurement Content: Wall-clock time from
PROFILER_STARTtoPROFILER_ENDPrecision: Millisecond level, using
std::chrono::high_resolution_clockUse Cases: Algorithm execution time analysis, function call duration analysis
Memory Metric (MEMORY) - Important: Now Incremental Statistics
Measurement Content: Peak memory increment relative to start (not absolute memory value)
Calculation Method:
Peak Increment = max(memory observed during monitoring) - memory at start
Measurement Scope:
Default: Only current process RSS memory
With subprocess monitoring enabled: Current process + sum of all subprocess memory
Platform Implementation:
Windows:
WorkingSetSize(physical memory)macOS:
resident_size(RSS memory)Linux:
VmRSSin/proc/self/status(RSS memory)
CPU Metric (CPU)
Measurement Content: Process CPU time usage rate (user mode + kernel mode)
Calculation Method:
CPU Usage = (end CPU time - start CPU time) / wall-clock time × 100%
Note: Multi-threaded programs may exceed 100%
Platform Implementation:
Windows: CPU time based on process handle (currently returns 0)
macOS:
getrusage(RUSAGE_SELF)to get user mode + system mode timeLinux: utime+stime fields in
/proc/self/stat
Thread Count Metric (THREADS)
Measurement Content: Process thread count (start/end/peak)
Platform Implementation:
Windows:
CreateToolhelp32Snapshot+THREADENTRY32macOS:
task_threads()to get accurate thread countLinux:
Threadsfield in/proc/self/status
Subprocess Monitoring (SUBPROCESS)
Measurement Content: Resource usage of all descendant processes in the current process tree
Use Cases: Complete resource statistics when calling external tools (e.g., COLMAP, GLOMAP)
Implementation:
Windows:
CreateToolhelp32Snapshotto enumerate process treemacOS/Linux:
pscommand +awkto recursively find descendant processes
Typical Usage Examples
Basic Performance Profiling Usage
// Use in MethodPresetProfiler derived class
class MyAlgorithm : public MethodPresetProfiler {
public:
DataPtr Run() override {
// Automatically start performance profiling (using preset labels, default time only)
PROFILER_START_AUTO(true);
// Add stage checkpoints
InitializeData();
PROFILER_STAGE("initialization");
ProcessData();
PROFILER_STAGE("processing");
// End profiling and print statistics
PROFILER_END();
PROFILER_PRINT_STATS(true);
return result;
}
};
See also: PROFILER_START_AUTO() | PROFILER_STAGE() | PROFILER_END() | PROFILER_PRINT_STATS()
Advanced Performance Profiling Configuration
// Performance profiling with configurable metrics
POSDK_START(true, "time|memory|cpu"); // Track time, memory, CPU
// Process data...
ComplexComputation();
// Subprocess monitoring (when calling external tools)
int result = POSDK_SYSTEM("./external_tool", true); // Enable subprocess monitoring
PROFILER_END();
PROFILER_PRINT_STATS(true);
See also: POSDK_START() | POSDK_SYSTEM()
Structured Labels and Stage Analysis
// Use structured labels for experiment comparison
std::unordered_map<std::string, std::string> labels = {
{"algorithm", "advanced_sfm"},
{"dataset", "dataset_A"},
{"experiment", "comparison_2025"}
};
PROFILER_START_STRUCTURED(labels, true);
// Multi-stage performance analysis
PROFILER_STAGE("feature_extraction"); // [START, feature_extraction]
PROFILER_STAGE("feature_matching"); // [feature_extraction, feature_matching]
PROFILER_STAGE("reconstruction"); // [feature_matching, reconstruction]
PROFILER_END(); // [reconstruction, END]
See also: PROFILER_START_STRUCTURED()
System Command Performance Monitoring
// System command with automatic performance profiling
int result = POSDK_SYSTEM_AUTO("./intensive_workload", true);
// Or manually manage session
PROFILER_START_AUTO(true);
int result1 = POSDK_SYSTEM("./command1"); // No subprocess monitoring
int result2 = POSDK_SYSTEM("./command2", true); // Enable subprocess monitoring
PROFILER_END();
See also: POSDK_SYSTEM_AUTO()
Accumulated Statistics and Data Export
// View accumulated performance statistics
PM_PRINT_STATS("my_algorithm", true);
// Get average execution time
double avg_time = PM_GET_AVG_TIME("my_algorithm", true);
// Export performance data to CSV
ProfilerManager::GetInstance().ExportToCSV("performance_results.csv");
// Clear statistics
ProfilerManager::GetInstance().Clear();
See also: PM_PRINT_STATS() | PM_GET_AVG_TIME() | ExportToCSV() | Clear()
Scope Automatic Management
class MyMethod : public MethodPresetProfiler {
public:
DataPtr Run() override {
// Automatic performance profiling for entire method (RAII style)
PROFILER_SCOPE(true);
// Automatically statistics and submit when method ends
return ProcessData();
}
};
See also: PROFILER_SCOPE()
Profiler Macro Usage Guide
Basic Usage Macros
1. PROFILER_START_AUTO(enable_profiling)
Function: Automatically start performance profiling using method preset labels
Use Case: In methods that inherit from MethodPresetProfiler
Features: Automatically selects string or structured labels, optimized to disable subprocess monitoring by default (saves overhead)
// Use in MethodPresetProfiler derived class
class MyAlgorithm : public MethodPresetProfiler {
public:
DataPtr Run() override {
PROFILER_START_AUTO(true); // Automatically use configured labels, subprocess monitoring disabled by default
// Algorithm implementation...
auto result = ProcessData();
PROFILER_END();
PROFILER_PRINT_STATS(true);
return result;
}
};
Performance Optimization Notes:
Default Behavior: Subprocess monitoring disabled to avoid unnecessary system call overhead
Dynamic Enable: Subprocess monitoring is automatically enabled only when calling
POSDK_SYSTEMBackward Compatible: Existing code requires no modification, automatically gains performance improvement
2. PROFILER_START(label_str, enable_profiling)
Function: Start performance profiling with specified string label Parameters:
label_str: Profiling label stringenable_profiling: Whether to enable profiling (bool)
void MyFunction() {
PROFILER_START("my_custom_algorithm", true);
// Execute time-consuming operations
ComplexComputation();
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
3. PROFILER_START_STRUCTURED(structured_labels, enable_profiling)
Function: Start performance profiling with structured labels, supports CSV export Purpose: Generate CSV statistics tables with custom column headers
void ExperimentFunction() {
std::unordered_map<std::string, std::string> labels = {
{"pipeline", "PoSDK"},
{"dataset", "synthetic_data"},
{"algorithm", "advanced_sfm"},
{"version", "v2.1"}
};
PROFILER_START_STRUCTURED(labels, true);
// Experiment code
RunExperiment();
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
Advanced Feature Macros
4. PROFILER_START_WITH_METRICS(label_str, enable_profiling, metrics_config)
Function: Selectively enable specific performance metrics Parameters:
metrics_config: Metrics configuration string, separated by|Options:
"time","memory","cpu","threads","subprocess","ALL"
void LightweightProfiling() {
// Track time and memory only, skip CPU and thread statistics
PROFILER_START_WITH_METRICS("lightweight_test", true, "time|memory");
FastOperation();
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
5. PROFILER_START_WITH_SUBPROCESS(label_str, enable_profiling)
Function: Complete resource monitoring including subprocesses Use Case: Complete performance statistics when calling external programs
void CallExternalTool() {
PROFILER_START_WITH_SUBPROCESS("colmap_pipeline", true);
// Call external tools, will track subprocess resources
POSDK_SYSTEM("COLMAP feature_extractor --database_path database.db");
POSDK_SYSTEM("COLMAP exhaustive_matcher --database_path database.db");
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
Stage Analysis Macros
6. PROFILER_STAGE(stage_name)
Function: Add stage checkpoint, automatically calculate interval performance Features: Lock-free operation, automatically generates interval statistics
void MultiStageAlgorithm() {
PROFILER_START("multi_stage_sfm", true);
InitializeData();
PROFILER_STAGE("initialization"); // [START, initialization]
ExtractFeatures();
PROFILER_STAGE("feature_extraction"); // [initialization, feature_extraction]
MatchFeatures();
PROFILER_STAGE("feature_matching"); // [feature_extraction, feature_matching]
ReconstructScene();
PROFILER_STAGE("reconstruction"); // [feature_matching, reconstruction]
PROFILER_END(); // [reconstruction, END]
PROFILER_PRINT_STATS(true);
}
Scope Analysis Macros
7. PROFILER_SCOPE(enable_profiling)
Function: RAII-style automatic scope performance profiling Features: Automatically submits statistics when method ends
class MyAlgorithm : public MethodPresetProfiler {
public:
DataPtr Run() override {
PROFILER_SCOPE(true); // Automatic analysis for entire method
// Method implementation...
auto result = ProcessComplexData();
// Automatically statistics and submit when method ends
return result;
}
};
System Command Macros
8. POSDK_SYSTEM(command [, enable_profiling])
Function: System command execution with profiling awareness Parameters:
command: Command string to executeenable_profiling: Optional, defaults to true Features: Automatically dynamically enables subprocess monitoring, performs pre/post execution sampling
void RunExternalCommands() {
PROFILER_START_AUTO(true); // Subprocess monitoring disabled by default, saves overhead
// POSDK_SYSTEM automatically enables subprocess monitoring, performs pre/post execution sampling
int result1 = POSDK_SYSTEM("./heavy_computation --input data.txt");
int result2 = POSDK_SYSTEM("python process_results.py", true);
int result3 = POSDK_SYSTEM("echo 'simple command'", false); // Disable monitoring
PROFILER_END();
PROFILER_PRINT_STATS(true);
}
Smart Optimization:
Enable on Demand: Subprocess monitoring is enabled only when calling
POSDK_SYSTEMAutomatic Switch: Automatically switches from current process monitoring to process tree monitoring
Performance Improvement: Avoids expensive subprocess system calls when not needed
9. POSDK_SYSTEM_AUTO(command, enable_profiling)
Function: Automatically create performance profiling session and execute command
Features: Equivalent to PROFILER_START_AUTO + POSDK_SYSTEM + PROFILER_END
void QuickSystemCommand() {
// Automatically create session, execute command, print statistics
int result = POSDK_SYSTEM_AUTO("./intensive_workload 3 150 2 4 2", true);
}
Statistics Display Macros
10. PROFILER_PRINT_STATS(enable_profiling)
Function: Print current session’s performance statistics
Usage: Must be called after PROFILER_END()
11. PM_PRINT_STATS(label_str, enable_profiling)
Function: Print accumulated performance statistics for specified label Features: Displays aggregated data from multiple runs
void ShowAccumulatedStats() {
// Display accumulated statistics for "my_algorithm" label
PM_PRINT_STATS("my_algorithm", true);
}
MethodPresetProfiler Integration Examples
Basic Integration
class MySfMAlgorithm : public MethodPresetProfiler
{
public:
MySfMAlgorithm() {
// Set profiling label
SetProfilerLabel("advanced_sfm_v2.1");
// Or use structured labels (recommended for experiment comparison)
SetProfilerLabels({
{"pipeline", "PoSDK"},
{"algorithm", "advanced_sfm"},
{"version", "v2.1"},
{"dataset", "synthetic"}
});
}
const std::string& GetType() const override {
static std::string type = "AdvancedSfMAlgorithm";
return type;
}
DataPtr Run() override {
// Method 1: Auto label + complete monitoring
PROFILER_START_AUTO(true);
// Initialization
auto cameras = InitializeCameras();
PROFILER_STAGE("camera_initialization");
// Feature extraction
auto features = ExtractFeatures();
PROFILER_STAGE("feature_extraction");
// Feature matching
auto matches = MatchFeatures(features);
PROFILER_STAGE("feature_matching");
// Call external tool for reconstruction
int result = POSDK_SYSTEM("COLMAP mapper --database_path temp.db");
PROFILER_STAGE("external_reconstruction");
// Post-processing
auto final_result = PostProcessing();
PROFILER_STAGE("post_processing");
PROFILER_END();
PROFILER_PRINT_STATS(true);
return final_result;
}
private:
DataPtr InitializeCameras() { /* Implementation... */ }
DataPtr ExtractFeatures() { /* Implementation... */ }
DataPtr MatchFeatures(const DataPtr& features) { /* Implementation... */ }
DataPtr PostProcessing() { /* Implementation... */ }
};
Experiment Comparison Example
class ExperimentRunner {
public:
void RunComparison() {
// Experiment 1: Basic algorithm
{
MySfMAlgorithm algo1;
algo1.SetProfilerLabels({
{"algorithm", "basic_sfm"},
{"dataset", "dataset_A"},
{"experiment", "comparison_2025"}
});
auto result1 = algo1.Build(input_data);
}
// Experiment 2: Improved algorithm
{
MySfMAlgorithm algo2;
algo2.SetProfilerLabels({
{"algorithm", "advanced_sfm"},
{"dataset", "dataset_A"},
{"experiment", "comparison_2025"}
});
auto result2 = algo2.Build(input_data);
}
// Export comparison data
ProfilerManager::GetInstance().ExportToCSV("experiment_results.csv");
}
};
Performance Statistics Output Description
Console Output Example
=== advanced_sfm_v2.1 Current Session Performance Statistics ===
Duration: 2847.32 ms
Memory Increment: 156.8 MB (relative to start)
CPU Usage: 287.4%
Thread Count (start/end): 1/8
Subprocess Count (detected/peak): 3/5
=== Stage Interval Statistics ===
START_to_camera_initialization: 145.23 ms
camera_initialization_to_feature_extraction: 856.45 ms
feature_extraction_to_feature_matching: 1243.67 ms
feature_matching_to_external_reconstruction: 445.89 ms
external_reconstruction_to_post_processing: 156.08 ms
post_processing_to_END: 45.67 ms
CSV Export Format
Main File (experiment_results.csv)
algorithm |
dataset |
experiment |
Label |
Session Count |
Profiling Threads |
Total Time(ms) |
Average Time(ms) |
Min Time(ms) |
Max Time(ms) |
Peak Memory(MB) |
Average CPU(%) |
Process Peak Threads |
Total Subprocesses |
Peak Subprocesses |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
basic_sfm |
dataset_A |
comparison_2025 |
algorithm=basic_sfm_dataset=dataset_A_experiment=comparison_2025 |
5 |
2 |
12847.32 |
2569.46 |
2234.12 |
2847.32 |
156.8 |
245.6 |
8 |
15 |
5 |
advanced_sfm |
dataset_A |
comparison_2025 |
algorithm=advanced_sfm_dataset=dataset_A_experiment=comparison_2025 |
5 |
2 |
11234.67 |
2246.93 |
2156.78 |
2334.12 |
142.3 |
267.8 |
12 |
18 |
6 |
Stage File (experiment_results_stages.csv)
Label |
Interval Name |
Total Duration(ms) |
Average Duration(ms) |
Count |
|---|---|---|---|---|
algorithm=basic_sfm_dataset=dataset_A_experiment=comparison_2025 |
START_to_camera_initialization |
725.65 |
145.13 |
5 |
algorithm=basic_sfm_dataset=dataset_A_experiment=comparison_2025 |
camera_initialization_to_feature_extraction |
4234.56 |
846.91 |
5 |
CSV Header Description
Main Statistics File Headers
Dynamic Structured Label Columns (e.g., algorithm, dataset, experiment): User-defined structured labels
Label: Profiling label (structured label combination or user-set string)
Session Count: Total number of sessions for this label
Profiling Threads: Number of different threads participating in profiling
Total Time(ms): Total time for all sessions (milliseconds)
Average Time(ms): Average time per session (milliseconds)
Min Time(ms): Shortest session time (milliseconds)
Max Time(ms): Longest session time (milliseconds)
Peak Memory(MB): Peak memory increment (MB, relative to start)
Average CPU(%): Average CPU usage rate (%, may exceed 100%)
Process Peak Threads: Process peak thread count
Total Subprocesses: Total number of detected subprocesses
Peak Subprocesses: Peak subprocess count
Stage Statistics File Headers
Label: Profiling label
Interval Name: Interval name (e.g., START_to_stage1, stage1_to_stage2)
Total Duration(ms): Total duration for this interval (accumulated across all sessions)
Average Duration(ms): Average duration for this interval
Count: Number of statistics for this interval
Important Notes
Memory Statistics Description
Peak memory is now incremental statistics, not absolute memory value
Calculation method:
Peak Memory = max(memory during monitoring) - memory at startMore suitable for analyzing actual algorithm memory consumption, excluding program base memory impact
Performance Overhead
Slight performance overhead when all metrics are enabled (usually <1-2%)
Subprocess monitoring adds additional overhead
Recommend disabling detailed monitoring in release versions
Platform Compatibility
All features fully supported on macOS and Linux
Windows platform has limited CPU monitoring functionality
Subprocess monitoring implementation differs across platforms but interface is consistent
Usage Recommendations
Development Phase: Use
PROFILER_START_AUTO+ complete metric monitoring (optimized, subprocess monitoring disabled by default)Performance Tuning: Use
PROFILER_STAGEfor fine-grained analysisExperiment Comparison: Use structured labels + CSV export
Production Environment: Selectively enable key metrics, avoid comprehensive monitoring
External Tool Calls: Use
POSDK_SYSTEMto automatically enable subprocess monitoring for complete resource statistics
By properly using these performance profiling tools, developers can effectively identify performance bottlenecks, optimize algorithm implementations, and conduct scientific experiment comparison analysis.