Difference between revisions of "Comparing Canister Cycles vs Performance Counter"
From Internet Computer Wiki
(Created page with "This small example clarifies the Canister Cycles balance <code>ic0.canister_cycle_balance()</code> and Performance Counter <code>ic0.performance_counter()</code> for inter-can...") |
|||
| Line 1: | Line 1: | ||
| − | This | + | This example clarifies the charges in terms of Canister Cycles (i.e. <code>ic0.canister_cycle_balance()</code>) and WASM Instructions (i.e. <code>ic0.performance_counter()</code>). |
== Setup == | == Setup == | ||
| Line 55: | Line 55: | ||
|style=text-align:left| 15. ''Canister A'' finishes execution <sup>4)</sup> || +(5B-100M)*4/10<br><code>≈999'913M</code> || <code>N/A</code><sup>1)</sup> || <code>999'959M</code> || <code>N/A</code><sup>1)</sup> | |style=text-align:left| 15. ''Canister A'' finishes execution <sup>4)</sup> || +(5B-100M)*4/10<br><code>≈999'913M</code> || <code>N/A</code><sup>1)</sup> || <code>999'959M</code> || <code>N/A</code><sup>1)</sup> | ||
|- | |- | ||
| − | !style=text-align:left| Total | + | !style=text-align:left| Total: !! <code>87M Cycles</code><br>for ~200M WASM Instructions Executed<br>+ messaging !! !! <code>41M Cycles</code><br>for ~100M WASM Instructions Executed<br>+ messaging !! |
|} | |} | ||
Revision as of 10:59, 24 May 2022
This example clarifies the charges in terms of Canister Cycles (i.e. ic0.canister_cycle_balance()) and WASM Instructions (i.e. ic0.performance_counter()).
Setup
- There is a User and two Canisters: Canisters A and Canister B
- The User sends an 1KiB Ingress Message to Canister A
- The Canister A calls Canister B with an 2KiB Update Call
- The Canister B replies to Canister A with an 300-byte response
- The Canister A replies to User with an 500-byte response
Example Cycles Flow
Naming conventions:
1K == 1'0001KiB == 1'024 bytes1M == 1'000'0001MiB == 1'048'576 bytes1B == 1'000'000'0001T == 1'000'000'000'000
| What is Happening | Canister A Cycles Balance |
Canister A Perf Counter |
Canister B Cycles Balance |
Canister B Perf Counter |
|---|---|---|---|---|
| 1. Initial state | 1T |
N/A1) |
1T |
N/A1)
|
| 2. Canister A receives 1KiB Ingress Message | -1,2M -1KiB*2K ≈999'996M |
N/A1) |
1T |
N/A1)
|
| 3. Canister A starts execution 2) | -5B/10*4≈997'996M |
0(5B limit) |
1T |
N/A1)
|
| 4. Canister A executes 100M WASM instructions | 997'996M |
+100M=100M(5B limit) |
1T |
N/A1)
|
| 5. Canister A sends 2KiB call to Canister B 3) | -260K -2KiB*1K -5B/10*4 -2MiB*1K ≈993'897M |
+3*20 +1KiB ≈100M(5B limit) |
1T |
N/A1)
|
| 5. Canister A finishes execution 4) | +(5B-100M)*4/10≈995'857M |
N/A1) |
1T |
N/A1)
|
| 6. Canister B receives a call from Canister A | 995'857M |
N/A1) |
-590K≈999'999M |
N/A1)
|
| 7. Canister B starts execution 2) | 995'857M |
N/A1) |
-5B/10*4≈997'999M |
0(5B limit) |
| 8. Canister B executes 100M WASM instructions | 995'857M |
N/A1) |
997'999M |
+100M=100M(5B limit) |
| 9. Canister B sends 300-byte response to Canister A | 995'857M |
N/A1) |
997'999M |
+2*20 +300 ≈100M(5B limit) |
| 10. Canister B finishes execution 4) | 995'857M |
N/A1) |
+(5B-100M)*4/10≈999'959M |
N/A1)
|
| 11. Canister A receives a response from Canister B 5) | +(2MiB-300)*1K≈997'953M |
N/A1) |
999'959M |
N/A1)
|
| 12. Canister A starts reply callback execution 6) | 997'953M |
0(5B limit) |
999'959M |
N/A1)
|
| 13. Canister A executes 100M WASM instructions | 997'953M |
+100M=100M(5B limit) |
999'959M |
N/A1)
|
| 14. Canister A sends 500-byte reply to User | 997'953M |
+2*20 +500 ≈100M(5B limit) |
999'959M |
N/A1)
|
| 15. Canister A finishes execution 4) | +(5B-100M)*4/10≈999'913M |
N/A1) |
999'959M |
N/A1)
|
| Total: | 87M Cyclesfor ~200M WASM Instructions Executed + messaging |
41M Cyclesfor ~100M WASM Instructions Executed + messaging |
Notes:
- The Performance Counter is available only during execution, so it's marked as
N/Awhen the execution has not started yet. - At the moment, there is a 5B instructions limit per normal message execution, so the Canister get charged for the maximum amount of Instructions it can potentially execute.
- The Canister get charged:
- 260'000
- for the inter-canister call
- 2KiB * 1'000
- for byte transmission
- 5B/10*4
- for 5B instructions limit to process the response
- 2MiB * 1K
- for the maximum response size
- The Canister gets a refund for the unused Instructions.
- The Canister gets a refund for the unused response bytes.
- The Canister has already been charged for the reply callback.