<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.internetcomputer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andriy.berestovskyy</id>
	<title>Internet Computer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.internetcomputer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andriy.berestovskyy"/>
	<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/wiki/Special:Contributions/Andriy.berestovskyy"/>
	<updated>2026-04-08T20:12:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Error_Codes_returned_by_Internet_Computer&amp;diff=7937</id>
		<title>Error Codes returned by Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Error_Codes_returned_by_Internet_Computer&amp;diff=7937"/>
		<updated>2024-10-10T09:46:01Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: Replaced content with &amp;quot;For up-to-date error codes please see: https://internetcomputer.org/docs/current/references/execution-errors&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For up-to-date error codes please see: https://internetcomputer.org/docs/current/references/execution-errors&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Error_Codes_returned_by_Internet_Computer&amp;diff=7936</id>
		<title>Error Codes returned by Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Error_Codes_returned_by_Internet_Computer&amp;diff=7936"/>
		<updated>2024-10-10T09:44:41Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When a user calls a canister method, the response contains the following information. &lt;br /&gt;
If the Internet Computer succeeded in running the canister method without any errors, then the response contains &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
status (text): replied&lt;br /&gt;
reply&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the Internet Computer generated any errors while processing the request, then the response contains &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
status (text): rejected&lt;br /&gt;
reject_code (nat)&lt;br /&gt;
reject_message (text)&lt;br /&gt;
error_code (text)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
More details on the response structure can be found in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-query interface spec]. There are a few dozen types of errors generated internally in the Internet Computer. Whenever an error is generated, it contains a 3-digit error code and a message describing the error. These list of error codes are not standardized and might change with implementation and as new features are added to the Internet Computer. If the error code is returned directly to the client, the client might not know how to respond to each of the error codes. To make the client&#039;s job easy, the Internet Computer&#039;s response additionally includes a 1-digit reject code, which is same as the most significant digit of the error code. There are 5 possible reject codes. Each of the reject codes semantically describes the type of error along with how the client should respond on seeing the error ([https://internetcomputer.org/docs/current/references/ic-interface-spec/#reject-codes interface spec]). These reject codes and their semantics are standardized in the interface spec, whereas the exact list of error codes is subject to change based on the implementation. The error code and the error message (reject_message) are also returned to the client. In the DFINITY&#039;s implementation of the Internet Computer, the error code is textually formed as &amp;lt;code&amp;gt;IC0XXX&amp;lt;/code&amp;gt; where XXX represents the 3-digit error code.&lt;br /&gt;
&lt;br /&gt;
== Error Codes == &lt;br /&gt;
This section describes each of the error codes generated in the DFINITY&#039;s implementation of the Internet Computer. &lt;br /&gt;
===== SubnetOverSubscribed: StatusCode 101 =====&lt;br /&gt;
This error is raised when installing a new canister or increasing memory allocation in the canister, and no compute allocation or memory capacity is left in the subnet. &lt;br /&gt;
		&lt;br /&gt;
===== MaxNumberOfCanistersReached: StatusCode 102 =====&lt;br /&gt;
There is an option in the NNS registry to set a max limit on the number of canisters in a subnet. When a new canister is created, the subnet checks if this maximum limit is reached and throws an error accordingly. Currently, there is no limit to the number of canisters in a subnet. &lt;br /&gt;
&lt;br /&gt;
===== CanisterQueueFull: StatusCode 201 =====&lt;br /&gt;
Internet Computer allows one canister to call another canister. These outgoing inter-canister canister calls are placed in the output queues of the canister. There is a currently a limit of 500 messages per output queue. CanisterOutputQueueFull error is thrown when this limit is reached. &lt;br /&gt;
&lt;br /&gt;
===== IngressMessageTimeout: StatusCode 202 =====&lt;br /&gt;
A user can call a method of a canister by sending an ingress message. The ingress messages go through consensus protocol. The ingress messages that are accepted by the consensus layer are pushed into ingress queue of the corresponding canister. The canister processes the messages in its ingress queue in order. If the IC is quite loaded and if a message stays in the ingress queue for over 5 minutes, then IngressMessageTimeout error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterQueueNotEmpty: StatusCode 203 =====&lt;br /&gt;
===== IngressHistoryFull: StatusCode 204 =====&lt;br /&gt;
===== CanisterIdAlreadyExists: StatusCode 205 =====&lt;br /&gt;
===== StopCanisterRequestTimeout: StatusCode 206 =====&lt;br /&gt;
===== CanisterOutOfCycles: StatusCode 207 =====&lt;br /&gt;
Each canister stores some cycles. When anyone sends a message to a canister, the canister spends a few cycles from its account to process the message. When someone sends a message and the canister doesn’t have enough cycles to process the message, CanisterOutOfCycles error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CertifiedStateUnavailable: StatusCode 208 =====&lt;br /&gt;
When a new node joins a subnet or when a node rejoins a subnet after some downtime, the node spends some time to sync the blockchain. Until the node syncs the certified state, it cannot serve queries. If the node gets a query before syncing the certified state, CertifiedStateUnavailable error is thrown. This error is temporary until the node catches up.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInstallCodeRateLimited: StatusCode 209 =====&lt;br /&gt;
After a canister is created, the controller of the canister can upgrade the WASM code inside the canister. If the controller upgrades the canister too many times or if the &amp;lt;code&amp;gt;install_code&amp;lt;/code&amp;gt; has a lot of instructions, then CanisterInstallCodeRateLimited error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterNotFound: StatusCode 301 =====&lt;br /&gt;
When a user/canister calls a canister which is not found, CanisterNotFound error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterMethodNotFound: StatusCode 302 =====&lt;br /&gt;
Each canister exposes a few methods that can be invoked by anyone. When a user/canister calls another canister, they need to specify a method to be invoked in the target canister. If this method is not found in the target canister, CanisterMethodNotFound error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterAlreadyInstalled: StatusCode 303 =====&lt;br /&gt;
When anyone attempts to create a new canister, they can optionally specify a canister id that is to be used for the newly created canister. If the specified canister id is already taken (another canister exists with the specified canister id), then CanisterAlreadyInstalled error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterWasmModuleNotFound: StatusCode 304 =====&lt;br /&gt;
A canister can be installed in a two step process. In the first step, a canister is created in a subnet and alloted a canister id. At this point, the canister is empty and does not contain any code. In the second step, the controller of the canister can install a Wasm module in the canister. If anyone sends an update/query call to the canister before the wasm module is installed, then CanisterWasmModuleNotFound error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== InsufficientMemoryAllocation: StatusCode 402 =====&lt;br /&gt;
The controller of a canister can specify a limit on how much memory the canister could use. If this memory allocation is too low for the canister to function properly, then InsufficientMemoryAllocation error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== InsufficientCyclesForCreateCanister: StatusCode 403 =====&lt;br /&gt;
When anyone tries to create a new canister, they need to spend at least 2 trillion cycles. If they do not own these funds, then InsufficientCyclesForCreateCanister error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== SubnetNotFound: StatusCode 404 =====&lt;br /&gt;
&lt;br /&gt;
===== CanisterNotHostedBySubnet: StatusCode 405 =====&lt;br /&gt;
===== CanisterRejectedMessage: StatusCode 406 =====&lt;br /&gt;
A canister can explicitly reject an incoming message by calling SystemAPI &amp;lt;code&amp;gt;ic0.msg_reject&amp;lt;/code&amp;gt;. For example, A canister could reject a message because it doesn’t allow certain principals to use an endpoint, or has rate limiting.&lt;br /&gt;
&lt;br /&gt;
===== UnknownManagementMessage: StatusCode 407 =====&lt;br /&gt;
Inside each subnet, there is a special canister called &#039;&#039;management canister&#039;&#039;&amp;lt;ref&amp;gt;https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-management-canister&amp;lt;/ref&amp;gt; with predefined methods. If someone calls a management canister and specifies a method&lt;br /&gt;
&lt;br /&gt;
===== InvalidManagementPayload: StatusCode 408 =====&lt;br /&gt;
When anyone calls a management canister with an invalid payload, InvalidManagementPayload error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterOutOfCycles: StatusCode 501 =====&lt;br /&gt;
The error is re-classified as transient, and hence renumbered to StatusCode 207.&lt;br /&gt;
&lt;br /&gt;
===== CanisterTrapped: StatusCode 502 =====&lt;br /&gt;
This error is thrown if the canister panicked somewhere or throws an error.&lt;br /&gt;
&lt;br /&gt;
===== CanisterCalledTrap: StatusCode 503 =====&lt;br /&gt;
This error is thrown if the canister explicitly decided to call System API &amp;lt;code&amp;gt;ic0.trap&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
===== CanisterContractViolation: StatusCode 504 =====&lt;br /&gt;
This error is thrown when a canister makes a System API call that is not allowed in that context. For example, when responding to a query call, a canister cannot call System API to check how many cycles are there in the query call.&lt;br /&gt;
&lt;br /&gt;
=====  CanisterInvalidWasm: StatusCode 505 =====&lt;br /&gt;
When anyone is installing or upgrading a canister and supplies an invalid WASM module, CanisterInvalidWasm error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterDidNotReply: StatusCode 506 ===== &lt;br /&gt;
&lt;br /&gt;
===== CanisterOutOfMemory: StatusCode 507 =====&lt;br /&gt;
A canister is allowed to reserve some memory for its usage. If a canister didn’t reserve memory before and is using memory beyond the subnet’s capacity, SubnetOverSubscribed error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterStopped: StatusCode 508 =====&lt;br /&gt;
This error is thrown when someone calls a canister that is already stopped.&lt;br /&gt;
&lt;br /&gt;
===== CanisterStopping: StatusCode 509 =====&lt;br /&gt;
This error is thrown when someone calls a canister that is stopping.&lt;br /&gt;
&lt;br /&gt;
===== CanisterNotStopped: StatusCode 510 =====&lt;br /&gt;
Only a canister that is in stopped state can be deleted. If someone tries to delete a canister that is not in the stopped state, CanisterNotStopped error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterStoppingCancelled: StatusCode 511 =====&lt;br /&gt;
Stopping a canister takes time. If someone restarts the canister during this time, CanisterStoppingCancelled error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInvalidController: StatusCode 512 =====&lt;br /&gt;
A canister is allowed to have a controller who has special rights over the canister. For example, the controller can call the management canister to upgrade its canister. When someone sends a management message to management canister without being the controller, CanisterInvalidController error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterFunctionNotFound: StatusCode 513 =====&lt;br /&gt;
The error will be returned when there is an attempt to invoke a callback function that does not exist in the Wasm’s function table.&lt;br /&gt;
&lt;br /&gt;
===== CanisterNonEmpty: StatusCode 514 =====&lt;br /&gt;
Once someone installs a canister, they cannot install the same canister again. They can either upgrade or reinstall the canister. If someone tries to install an already installed canister, CanisterNonEmpty error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CertifiedStateUnavailable: StatusCode 515 =====&lt;br /&gt;
The error is re-classified as transient, and hence renumbered to StatusCode 208.&lt;br /&gt;
&lt;br /&gt;
===== CanisterRejectedMessage: StatusCode 516 =====&lt;br /&gt;
The error is re-classified as a canister reject, and hence renumbered to StatusCode 406.&lt;br /&gt;
&lt;br /&gt;
===== QueryCallGraphLoopDetected: StatusCode 517 ===== &lt;br /&gt;
When responding to a query/update call, a canister can make an inter-canister call to another canister. When responding to a query call, if canister X calls canister Y, and then canister Y cannot calls back Canister X, an InterCanisterQueryLoopDetected error is thrown. This error is thrown only for inter-canister query calls. An inter-canister loop is acceptable when responding to update calls.&lt;br /&gt;
&lt;br /&gt;
===== UnknownManagementMessage: StatusCode 518 =====&lt;br /&gt;
The error is re-classified as a canister reject, and hence renumbered to StatusCode 407.&lt;br /&gt;
&lt;br /&gt;
===== InvalidManagementPayload: StatusCode 519 =====&lt;br /&gt;
The error is re-classified as a canister reject, and hence renumbered to StatusCode 408.&lt;br /&gt;
&lt;br /&gt;
===== InsufficientCyclesInCall: StatusCode 520 =====&lt;br /&gt;
A canister can send cycles to another canister by making an update call with cycles attached. The recipient can choose to accept some of the cycles in the update call. The rest of the cycles are returned to the sender. InsufficientCyclesInCall error is thrown when the recipient is trying to accept more cycles than what is included in the call.&lt;br /&gt;
&lt;br /&gt;
===== CanisterWasmEngineError: StatusCode 521 =====&lt;br /&gt;
CanisterWasmEngineError error is thrown by the Internet Computer if WASM runtime library throws any error.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInstructionLimitExceeded: StatusCode 522 =====&lt;br /&gt;
A canister has a limit on the number of instructions it can execute when responding to a query/update call. The limit is 5 Billion instructions when deterministic time slicing is not enabled. The limit is 40 Billion instructions when the deterministic time slicing feature is enabled. If a canister executes more instructions, then CanisterInstructionLimitExceeded error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInstallCodeRateLimited: StatusCode 523 =====&lt;br /&gt;
The error is re-classified as transient, and hence renumbered to StatusCode 209.&lt;br /&gt;
&lt;br /&gt;
===== CanisterMemoryAccessLimitExceeded: StatusCode 524 =====&lt;br /&gt;
A canister can store up to 32 GB of memory. In a single canister call, the canister is allowed to access up to 8 GB of memory. If a canister accesses more memory than the limit in a single canister call, CanisterMemoryAccessLimitExceeded error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== QueryCallGraphTooDeep: StatusCode 525 =====&lt;br /&gt;
===== QueryCallGraphTotalInstructionLimitExceeded: StatusCode 526 =====&lt;br /&gt;
===== CompositeQueryCalledInReplicatedMode: StatusCode 527 =====&lt;br /&gt;
===== QueryTimeLimitExceeded: StatusCode 528 =====&lt;br /&gt;
===== QueryCallGraphInternal: StatusCode 529 =====&lt;br /&gt;
===== InsufficientCyclesInComputeAllocation: StatusCode 530 =====&lt;br /&gt;
===== InsufficientCyclesInMemoryAllocation: StatusCode 531 =====&lt;br /&gt;
===== InsufficientCyclesInMemoryGrow: StatusCode 532 =====&lt;br /&gt;
===== ReservedCyclesLimitExceededInMemoryAllocation: StatusCode 533 =====&lt;br /&gt;
===== ReservedCyclesLimitExceededInMemoryGrow: StatusCode 534 =====&lt;br /&gt;
===== InsufficientCyclesInMessageMemoryGrow: StatusCode 535 =====&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Error_Codes_returned_by_Internet_Computer&amp;diff=7456</id>
		<title>Error Codes returned by Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Error_Codes_returned_by_Internet_Computer&amp;diff=7456"/>
		<updated>2024-02-28T18:52:59Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: Updated the error codes and format IC0XXX&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When a user calls a canister method, the response contains the following information. &lt;br /&gt;
If the Internet Computer succeeded in running the canister method without any errors, then the response contains &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
status (text): replied&lt;br /&gt;
reply&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the Internet Computer generated any errors while processing the request, then the response contains &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
status (text): rejected&lt;br /&gt;
reject_code (nat)&lt;br /&gt;
reject_message (text)&lt;br /&gt;
error_code (text)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
More details on the response structure can be found in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-query interface spec]. There are a few dozen types of errors generated internally in the Internet Computer. Whenever an error is generated, it contains a 3-digit error code and a message describing the error. These list of error codes are not standardized and might change with implementation and as new features are added to the Internet Computer. If the error code is returned directly to the client, the client might not know how to respond to each of the error codes. To make the client&#039;s job easy, the Internet Computer&#039;s response additionally includes a 1-digit reject code, which is same as the most significant digit of the error code. There are 5 possible reject codes. Each of the reject codes semantically describes the type of error along with how the client should respond on seeing the error ([https://internetcomputer.org/docs/current/references/ic-interface-spec/#reject-codes interface spec]). These reject codes and their semantics are standardized in the interface spec, whereas the exact list of error codes is subject to change based on the implementation. The error code and the error message (reject_message) are also returned to the client. In the DFINITY&#039;s implementation of the Internet Computer, the error code is textually formed as &amp;lt;code&amp;gt;IC0XXX&amp;lt;/code&amp;gt; where XXX represents the 3-digit error code.&lt;br /&gt;
&lt;br /&gt;
== Error Codes == &lt;br /&gt;
This section describes each of the error codes generated in the DFINITY&#039;s implementation of the Internet Computer. &lt;br /&gt;
===== SubnetOverSubscribed: StatusCode 101 =====&lt;br /&gt;
This error is raised when installing a new canister or increasing memory allocation in the canister, and no compute allocation or memory capacity is left in the subnet. &lt;br /&gt;
		&lt;br /&gt;
===== MaxNumberOfCanistersReached: StatusCode 102 =====&lt;br /&gt;
There is an option in the NNS registry to set a max limit on the number of canisters in a subnet. When a new canister is created, the subnet checks if this maximum limit is reached and throws an error accordingly. Currently, there is no limit to the number of canisters in a subnet. &lt;br /&gt;
&lt;br /&gt;
===== CanisterQueueFull: StatusCode 201 =====&lt;br /&gt;
Internet Computer allows one canister to call another canister. These outgoing inter-canister canister calls are placed in the output queues of the canister. There is a currently a limit of 500 messages per output queue. CanisterOutputQueueFull error is thrown when this limit is reached. &lt;br /&gt;
&lt;br /&gt;
===== IngressMessageTimeout: StatusCode 202 =====&lt;br /&gt;
A user can call a method of a canister by sending an ingress message. The ingress messages go through consensus protocol. The ingress messages that are accepted by the consensus layer are pushed into ingress queue of the corresponding canister. The canister processes the messages in its ingress queue in order. If the IC is quite loaded and if a message stays in the ingress queue for over 5 minutes, then IngressMessageTimeout error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterQueueNotEmpty: StatusCode 203 =====&lt;br /&gt;
===== IngressHistoryFull: StatusCode 204 =====&lt;br /&gt;
===== CanisterIdAlreadyExists: StatusCode 205 =====&lt;br /&gt;
===== StopCanisterRequestTimeout: StatusCode 206 =====&lt;br /&gt;
===== CanisterOutOfCycles: StatusCode 207 =====&lt;br /&gt;
Each canister stores some cycles. When anyone sends a message to a canister, the canister spends a few cycles from its account to process the message. When someone sends a message and the canister doesn’t have enough cycles to process the message, CanisterOutOfCycles error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CertifiedStateUnavailable: StatusCode 208 =====&lt;br /&gt;
When a new node joins a subnet or when a node rejoins a subnet after some downtime, the node spends some time to sync the blockchain. Until the node syncs the certified state, it cannot serve queries. If the node gets a query before syncing the certified state, CertifiedStateUnavailable error is thrown. This error is temporary until the node catches up.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInstallCodeRateLimited: StatusCode 209 =====&lt;br /&gt;
After a canister is created, the controller of the canister can upgrade the WASM code inside the canister. If the controller upgrades the canister too many times or if the &amp;lt;code&amp;gt;install_code&amp;lt;/code&amp;gt; has a lot of instructions, then CanisterInstallCodeRateLimited error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterNotFound: StatusCode 301 =====&lt;br /&gt;
When a user/canister calls a canister which is not found, CanisterNotFound error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterMethodNotFound: StatusCode 302 =====&lt;br /&gt;
Each canister exposes a few methods that can be invoked by anyone. When a user/canister calls another canister, they need to specify a method to be invoked in the target canister. If this method is not found in the target canister, CanisterMethodNotFound error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterAlreadyInstalled: StatusCode 303 =====&lt;br /&gt;
When anyone attempts to create a new canister, they can optionally specify a canister id that is to be used for the newly created canister. If the specified canister id is already taken (another canister exists with the specified canister id), then CanisterAlreadyInstalled error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterWasmModuleNotFound: StatusCode 304 =====&lt;br /&gt;
A canister can be installed in a two step process. In the first step, a canister is created in a subnet and alloted a canister id. At this point, the canister is empty and does not contain any code. In the second step, the controller of the canister can install a Wasm module in the canister. If anyone sends an update/query call to the canister before the wasm module is installed, then CanisterWasmModuleNotFound error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== InsufficientMemoryAllocation: StatusCode 402 =====&lt;br /&gt;
The controller of a canister can specify a limit on how much memory the canister could use. If this memory allocation is too low for the canister to function properly, then InsufficientMemoryAllocation error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== InsufficientCyclesForCreateCanister: StatusCode 403 =====&lt;br /&gt;
When anyone tries to create a new canister, they need to spend at least 2 trillion cycles. If they do not own these funds, then InsufficientCyclesForCreateCanister error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== SubnetNotFound: StatusCode 404 =====&lt;br /&gt;
&lt;br /&gt;
===== CanisterNotHostedBySubnet: StatusCode 405 =====&lt;br /&gt;
===== CanisterRejectedMessage: StatusCode 406 =====&lt;br /&gt;
A canister can explicitly reject an incoming message by calling SystemAPI &amp;lt;code&amp;gt;ic0.msg_reject&amp;lt;/code&amp;gt;. For example, A canister could reject a message because it doesn’t allow certain principals to use an endpoint, or has rate limiting.&lt;br /&gt;
&lt;br /&gt;
===== UnknownManagementMessage: StatusCode 407 =====&lt;br /&gt;
Inside each subnet, there is a special canister called &#039;&#039;management canister&#039;&#039;&amp;lt;ref&amp;gt;https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-management-canister&amp;lt;/ref&amp;gt; with predefined methods. If someone calls a management canister and specifies a method&lt;br /&gt;
&lt;br /&gt;
===== InvalidManagementPayload: StatusCode 408 =====&lt;br /&gt;
When anyone calls a management canister with an invalid payload, InvalidManagementPayload error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterOutOfCycles: StatusCode 501 =====&lt;br /&gt;
The error is re-classified as transient, and hence renumbered to StatusCode 207.&lt;br /&gt;
&lt;br /&gt;
===== CanisterTrapped: StatusCode 502 =====&lt;br /&gt;
This error is thrown if the canister panicked somewhere or throws an error.&lt;br /&gt;
&lt;br /&gt;
===== CanisterCalledTrap: StatusCode 503 =====&lt;br /&gt;
This error is thrown if the canister explicitly decided to call System API &amp;lt;code&amp;gt;ic0.trap&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
===== CanisterContractViolation: StatusCode 504 =====&lt;br /&gt;
This error is thrown when a canister makes a System API call that is not allowed in that context. For example, when responding to a query call, a canister cannot call System API to check how many cycles are there in the query call.&lt;br /&gt;
&lt;br /&gt;
=====  CanisterInvalidWasm: StatusCode 505 =====&lt;br /&gt;
When anyone is installing or upgrading a canister and supplies an invalid WASM module, CanisterInvalidWasm error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterDidNotReply: StatusCode 506 ===== &lt;br /&gt;
&lt;br /&gt;
===== CanisterOutOfMemory: StatusCode 507 =====&lt;br /&gt;
A canister is allowed to reserve some memory for its usage. If a canister didn’t reserve memory before and is using memory beyond the subnet’s capacity, SubnetOverSubscribed error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterStopped: StatusCode 508 =====&lt;br /&gt;
This error is thrown when someone calls a canister that is already stopped.&lt;br /&gt;
&lt;br /&gt;
===== CanisterStopping: StatusCode 509 =====&lt;br /&gt;
This error is thrown when someone calls a canister that is stopping.&lt;br /&gt;
&lt;br /&gt;
===== CanisterNotStopped: StatusCode 510 =====&lt;br /&gt;
Only a canister that is in stopped state can be deleted. If someone tries to delete a canister that is not in the stopped state, CanisterNotStopped error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterStoppingCancelled: StatusCode 511 =====&lt;br /&gt;
Stopping a canister takes time. If someone restarts the canister during this time, CanisterStoppingCancelled error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInvalidController: StatusCode 512 =====&lt;br /&gt;
A canister is allowed to have a controller who has special rights over the canister. For example, the controller can call the management canister to upgrade its canister. When someone sends a management message to management canister without being the controller, CanisterInvalidController error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterFunctionNotFound: StatusCode 513 =====&lt;br /&gt;
The error will be returned when there is an attempt to invoke a callback function that does not exist in the Wasm’s function table.&lt;br /&gt;
&lt;br /&gt;
===== CanisterNonEmpty: StatusCode 514 =====&lt;br /&gt;
Once someone installs a canister, they cannot install the same canister again. They can either upgrade or reinstall the canister. If someone tries to install an already installed canister, CanisterNonEmpty error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CertifiedStateUnavailable: StatusCode 515 =====&lt;br /&gt;
The error is re-classified as transient, and hence renumbered to StatusCode 208.&lt;br /&gt;
&lt;br /&gt;
===== CanisterRejectedMessage: StatusCode 516 =====&lt;br /&gt;
The error is re-classified as a canister reject, and hence renumbered to StatusCode 406.&lt;br /&gt;
&lt;br /&gt;
===== QueryCallGraphLoopDetected: StatusCode 517 ===== &lt;br /&gt;
When responding to a query/update call, a canister can make an inter-canister call to another canister. When responding to a query call, if canister X calls canister Y, and then canister Y cannot calls back Canister X, an InterCanisterQueryLoopDetected error is thrown. This error is thrown only for inter-canister query calls. An inter-canister loop is acceptable when responding to update calls.&lt;br /&gt;
&lt;br /&gt;
===== UnknownManagementMessage: StatusCode 518 =====&lt;br /&gt;
The error is re-classified as a canister reject, and hence renumbered to StatusCode 407.&lt;br /&gt;
&lt;br /&gt;
===== InvalidManagementPayload: StatusCode 519 =====&lt;br /&gt;
The error is re-classified as a canister reject, and hence renumbered to StatusCode 408.&lt;br /&gt;
&lt;br /&gt;
===== InsufficientCyclesInCall: StatusCode 520 =====&lt;br /&gt;
A canister can send cycles to another canister by making an update call with cycles attached. The recipient can choose to accept some of the cycles in the update call. The rest of the cycles are returned to the sender. InsufficientCyclesInCall error is thrown when the recipient is trying to accept more cycles than what is included in the call.&lt;br /&gt;
&lt;br /&gt;
===== CanisterWasmEngineError: StatusCode 521 =====&lt;br /&gt;
CanisterWasmEngineError error is thrown by the Internet Computer if WASM runtime library throws any error.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInstructionLimitExceeded: StatusCode 522 =====&lt;br /&gt;
A canister has a limit on the number of instructions it can execute when responding to a query/update call. The limit is 5 Billion instructions when deterministic time slicing is not enabled. The limit is 30 Billion instructions when the deterministic time slicing feature is enabled. If a canister executes more instructions, then CanisterInstructionLimitExceeded error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== CanisterInstallCodeRateLimited: StatusCode 523 =====&lt;br /&gt;
The error is re-classified as transient, and hence renumbered to StatusCode 209.&lt;br /&gt;
&lt;br /&gt;
===== CanisterMemoryAccessLimitExceeded: StatusCode 524 =====&lt;br /&gt;
A canister can store up to 32 GB of memory. In a single canister call, the canister is allowed to access up to 8 GB of memory. If a canister accesses more memory than the limit in a single canister call, CanisterMemoryAccessLimitExceeded error is thrown.&lt;br /&gt;
&lt;br /&gt;
===== QueryCallGraphTooDeep: StatusCode 525 =====&lt;br /&gt;
===== QueryCallGraphTotalInstructionLimitExceeded: StatusCode 526 =====&lt;br /&gt;
===== CompositeQueryCalledInReplicatedMode: StatusCode 527 =====&lt;br /&gt;
===== QueryTimeLimitExceeded: StatusCode 528 =====&lt;br /&gt;
===== QueryCallGraphInternal: StatusCode 529 =====&lt;br /&gt;
===== InsufficientCyclesInComputeAllocation: StatusCode 530 =====&lt;br /&gt;
===== InsufficientCyclesInMemoryAllocation: StatusCode 531 =====&lt;br /&gt;
===== InsufficientCyclesInMemoryGrow: StatusCode 532 =====&lt;br /&gt;
===== ReservedCyclesLimitExceededInMemoryAllocation: StatusCode 533 =====&lt;br /&gt;
===== ReservedCyclesLimitExceededInMemoryGrow: StatusCode 534 =====&lt;br /&gt;
===== InsufficientCyclesInMessageMemoryGrow: StatusCode 535 =====&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=6365</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=6365"/>
		<updated>2023-08-16T19:37:37Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# Canisters &#039;&#039;A&#039;&#039; and &#039;&#039;B&#039;&#039; are on the same subnet.&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Example Step !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;-590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;sup&amp;gt;7)&amp;lt;/sup&amp;gt;&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) ||&amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;sup&amp;gt;7)&amp;lt;/sup&amp;gt;&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 590K : for the update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions it can potentially execute&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260K : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1K : for byte transmission&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
#; 590K : for the reply update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit it can potentially execute in the reply handler&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged in step 5 for the reply execution and 5B instructions.&lt;br /&gt;
# The &amp;lt;code&amp;gt;n*21&amp;lt;/code&amp;gt; represents System API calls costs.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://internetcomputer.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://internetcomputer.org/docs/current/developer-docs/deploy/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=6364</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=6364"/>
		<updated>2023-08-16T19:36:53Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# Canisters &#039;&#039;A&#039;&#039; and &#039;&#039;B&#039;&#039; are on the same subnet.&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Example Step !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;-590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;sup&amp;gt;7)&amp;lt;/sup&amp;gt;&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) ||&amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;sup&amp;gt;7)&amp;lt;/sup&amp;gt;&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 590K : for the update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions it can potentially execute&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260K : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1K : for byte transmission&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
#; 590K : for the reply update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit it can potentially execute in the reply handler&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged in step 5 for the reply execution and 5B instructions.&lt;br /&gt;
# The `n*21` represents System API calls costs.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://internetcomputer.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://internetcomputer.org/docs/current/developer-docs/deploy/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=4028</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=4028"/>
		<updated>2022-12-19T11:21:42Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# Canisters &#039;&#039;A&#039;&#039; and &#039;&#039;B&#039;&#039; are on the same subnet.&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Example Step !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;-590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 590K : for the update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions it can potentially execute&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260K : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
#; 590K : for the reply update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit it can potentially execute in the reply handler&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged in step 5 for the reply execution and 5B instructions.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://internetcomputer.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://internetcomputer.org/docs/current/developer-docs/deploy/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2368</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2368"/>
		<updated>2022-05-24T15:48:49Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Example Step !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;-590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 590K : for the update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions it can potentially execute&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260K : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
#; 590K : for the reply update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit it can potentially execute in the reply handler&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged in step 5 for the reply execution and 5B instructions.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2367</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2367"/>
		<updated>2022-05-24T15:44:23Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;-590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 590K : for the update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions it can potentially execute&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260K : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
#; 590K : for the reply update message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit it can potentially execute in the reply handler&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2366</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2366"/>
		<updated>2022-05-24T15:40:22Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;-590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260K : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
#; 590K : for the reply message execution&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the reply&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2365</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2365"/>
		<updated>2022-05-24T14:40:28Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example walks through a scenario of charging cycles that includes inter-canister calls and how the performance counter relates to the work done by canisters.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the reply&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2364</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2364"/>
		<updated>2022-05-24T12:52:03Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example clarifies the charges in terms of Canister Cycles (i.e. &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt;) and WASM Instructions (i.e. &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; responds to &#039;&#039;Canister A&#039;&#039; with an 300-byte reply&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; responds to &#039;&#039;User&#039;&#039; with an 500-byte reply&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte reply to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a reply from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the reply&lt;br /&gt;
#; 2MiB * 1K : for the maximum reply size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused reply bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2363</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2363"/>
		<updated>2022-05-24T12:49:49Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example clarifies the charges in terms of Canister Cycles (i.e. &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt;) and WASM Instructions (i.e. &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# There is a &#039;&#039;User&#039;&#039; and two Canisters: &#039;&#039;Canisters A&#039;&#039; and &#039;&#039;Canister B&#039;&#039;&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; replies to &#039;&#039;Canister A&#039;&#039; with an 300-byte response&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; replies to &#039;&#039;User&#039;&#039; with an 500-byte response&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte response to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a response from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;~87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;~41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the response&lt;br /&gt;
#; 2MiB * 1K : for the maximum response size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused response bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2362</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2362"/>
		<updated>2022-05-24T12:48:59Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example clarifies the charges in terms of Canister Cycles (i.e. &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt;) and WASM Instructions (i.e. &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# There is a &#039;&#039;User&#039;&#039; and two Canisters: &#039;&#039;Canisters A&#039;&#039; and &#039;&#039;Canister B&#039;&#039;&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; replies to &#039;&#039;Canister A&#039;&#039; with an 300-byte response&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; replies to &#039;&#039;User&#039;&#039; with an 500-byte response&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+2KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte response to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a response from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the response&lt;br /&gt;
#; 2MiB * 1K : for the maximum response size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused response bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2360</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2360"/>
		<updated>2022-05-24T11:04:32Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example clarifies the charges in terms of Canister Cycles (i.e. &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt;) and WASM Instructions (i.e. &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# There is a &#039;&#039;User&#039;&#039; and two Canisters: &#039;&#039;Canisters A&#039;&#039; and &#039;&#039;Canister B&#039;&#039;&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; replies to &#039;&#039;Canister A&#039;&#039; with an 300-byte response&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; replies to &#039;&#039;User&#039;&#039; with an 500-byte response&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*21&amp;lt;br&amp;gt;+1KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte response to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a response from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*21&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the response&lt;br /&gt;
#; 2MiB * 1K : for the maximum response size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused response bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2359</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2359"/>
		<updated>2022-05-24T10:59:40Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example clarifies the charges in terms of Canister Cycles (i.e. &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt;) and WASM Instructions (i.e. &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# There is a &#039;&#039;User&#039;&#039; and two Canisters: &#039;&#039;Canisters A&#039;&#039; and &#039;&#039;Canister B&#039;&#039;&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; replies to &#039;&#039;Canister A&#039;&#039; with an 300-byte response&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; replies to &#039;&#039;User&#039;&#039; with an 500-byte response&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*20&amp;lt;br&amp;gt;+1KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte response to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*20&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a response from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*20&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total: !! &amp;lt;code&amp;gt;87M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~200M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!  !! &amp;lt;code&amp;gt;41M Cycles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;for ~100M WASM Instructions Executed&amp;lt;br&amp;gt;+ messaging !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the response&lt;br /&gt;
#; 2MiB * 1K : for the maximum response size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused response bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2358</id>
		<title>Comparing Canister Cycles vs Performance Counter</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Comparing_Canister_Cycles_vs_Performance_Counter&amp;diff=2358"/>
		<updated>2022-05-24T10:52:20Z</updated>

		<summary type="html">&lt;p&gt;Andriy.berestovskyy: Created page with &amp;quot;This small example clarifies the Canister Cycles balance &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt; and Performance Counter &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt; for inter-can...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This small example clarifies the Canister Cycles balance &amp;lt;code&amp;gt;ic0.canister_cycle_balance()&amp;lt;/code&amp;gt; and Performance Counter &amp;lt;code&amp;gt;ic0.performance_counter()&amp;lt;/code&amp;gt; for inter-canister calls.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# There is a &#039;&#039;User&#039;&#039; and two Canisters: &#039;&#039;Canisters A&#039;&#039; and &#039;&#039;Canister B&#039;&#039;&lt;br /&gt;
# The &#039;&#039;User&#039;&#039; sends an 1KiB &#039;&#039;Ingress Message&#039;&#039; to &#039;&#039;Canister A&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; calls &#039;&#039;Canister B&#039;&#039; with an 2KiB &#039;&#039;Update Call&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Canister B&#039;&#039; replies to &#039;&#039;Canister A&#039;&#039; with an 300-byte response&lt;br /&gt;
# The &#039;&#039;Canister A&#039;&#039; replies to &#039;&#039;User&#039;&#039; with an 500-byte response&lt;br /&gt;
&lt;br /&gt;
== Example Cycles Flow ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Naming conventions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1K == 1&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1KiB == 1&#039;024 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1M == 1&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1MiB == 1&#039;048&#039;576 bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1B == 1&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1T == 1&#039;000&#039;000&#039;000&#039;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What is Happening !! Canister A&amp;lt;br&amp;gt;Cycles Balance !! Canister A&amp;lt;br&amp;gt;Perf Counter !! Canister B&amp;lt;br&amp;gt;Cycles Balance !! Canister B&amp;lt;br&amp;gt;Perf Counter&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 1. Initial state || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 2. &#039;&#039;Canister A&#039;&#039; receives 1KiB &#039;&#039;Ingress Message&#039;&#039; || -1,2M&amp;lt;br&amp;gt;-1KiB*2K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 3. &#039;&#039;Canister A&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;996M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 4. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;996M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; sends 2KiB call to &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;3)&amp;lt;/sup&amp;gt; || -260K&amp;lt;br&amp;gt;-2KiB*1K&amp;lt;br&amp;gt;-5B/10*4&amp;lt;br&amp;gt;-2MiB*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈993&#039;897M&amp;lt;/code&amp;gt; || +3*20&amp;lt;br&amp;gt;+1KiB&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 5. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;1T&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 6. &#039;&#039;Canister B&#039;&#039; receives a call from &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -590K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 7. &#039;&#039;Canister B&#039;&#039; starts execution &amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;|| &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || -5B/10*4&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;999M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 8. &#039;&#039;Canister B&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 9. &#039;&#039;Canister B&#039;&#039; sends 300-byte response to &#039;&#039;Canister A&#039;&#039; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;999M&amp;lt;/code&amp;gt; || +2*20&amp;lt;br&amp;gt;+300&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 10. &#039;&#039;Canister B&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;995&#039;857M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 11. &#039;&#039;Canister A&#039;&#039; receives a response from &#039;&#039;Canister B&#039;&#039; &amp;lt;sup&amp;gt;5)&amp;lt;/sup&amp;gt; || +(2MiB-300)*1K&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 12. &#039;&#039;Canister A&#039;&#039; starts reply callback execution &amp;lt;sup&amp;gt;6)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit)  || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 13. &#039;&#039;Canister A&#039;&#039; executes 100M WASM instructions || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +100M&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;=100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 14. &#039;&#039;Canister A&#039;&#039; sends 500-byte reply to &#039;&#039;User&#039;&#039; || &amp;lt;code&amp;gt;997&#039;953M&amp;lt;/code&amp;gt; || +2*20&amp;lt;br&amp;gt;+500&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈100M&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(5B limit) || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=text-align:left| 15. &#039;&#039;Canister A&#039;&#039; finishes execution &amp;lt;sup&amp;gt;4)&amp;lt;/sup&amp;gt; || +(5B-100M)*4/10&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;≈999&#039;913M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; || &amp;lt;code&amp;gt;999&#039;959M&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=text-align:left| Total Cycles Spent: !! &amp;lt;code&amp;gt;87M&amp;lt;/code&amp;gt; !!  !! &amp;lt;code&amp;gt;41M&amp;lt;/code&amp;gt; !!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
# The &#039;&#039;Performance Counter&#039;&#039; is available only during execution, so it&#039;s marked as &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; when the execution has not started yet.&lt;br /&gt;
# 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.&lt;br /&gt;
# The Canister get charged:&lt;br /&gt;
#; 260&#039;000 : for the inter-canister call&lt;br /&gt;
#; 2KiB * 1&#039;000 : for byte transmission&lt;br /&gt;
#; 5B/10*4 : for 5B instructions limit to process the response&lt;br /&gt;
#; 2MiB * 1K : for the maximum response size&lt;br /&gt;
# The Canister gets a refund for the unused Instructions.&lt;br /&gt;
# The Canister gets a refund for the unused response bytes.&lt;br /&gt;
# The Canister has already been charged for the reply callback.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
# [https://smartcontracts.org/docs/current/developer-docs/updates/computation-and-storage-costs The Internet Computer Computation and Storage Costs]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YL4R4jQ78u0 Community Conversations | Charging Canister Cycles]&lt;/div&gt;</summary>
		<author><name>Andriy.berestovskyy</name></author>
	</entry>
</feed>