2

I'm trying to figure out how to optimize one of my smart contracts for less billed CPU-usage.

There are typically different methods to optimize performance of algorithms but I'm not clear about if a high-performance smart-contract also results in less CPU-usage.

From the eos.io-whitepaper:

On a launched blockchain adopting the EOS.IO software, at a network level all transactions are billed a computational bandwidth cost based on the number of WASM instructions executed. However, each individual block producer using the software may calculate resource usage using their own algorithm and measurements.

  1. Is this CPU-billing-scheme still in use?

  2. A very basic example of a wasm-instruction is for example the sqrt instruction. Let's imagine i implement a more performant sqrt-algorithtm (i know it's nearly impossoble and i will never do that!) which doesn't use a single wasm sqrt and instead uses multiple shifts, subs and divs or whatever and therefore executes more WASM Instructions, will the billed CPU-usage for execution be higher?

  3. Another different and very basic example is multiplying two int32 vs multiplying two floats. In traditional environemts multiplying two floats will result in slightly higher CPU-usage than when multiplying two integers - but if we only count wasm instructions both calculations execute the same amount of wasm instructions - 1.

To get to the Point:

If I want to optimize the code of a smart contract for less billed CPU-usage, do i have to write high-performance code - or do i have to reduce the amount of wasm instructions executed by the contract?

  • Check this: medium.com/@pEOS_one/… – Nat Apr 27 '19 at 17:26
  • 1
    Using the number of WASM instructions for billing CPU bandwidth consumption is dropped. Instead, timer is used as Phillip explained, and the amount of CPU bandwidth consumed by each transaction is shipped in block and propagated. (to let all BPs record same resource consumption) – conr2d Jul 4 '19 at 9:12
1
  1. Is this CPU-billing-scheme still in use?

To the best of my knowledge, yes

Points 2. and 3.

My understanding of CPU billing works is as follows:

  1. A BP receives your transaction, starts a timer, processes it as fast as they can, stops a timer.
  2. The time they record is the CPU billing time that you get charged.

Therefore, the number of wasm instructions itself is less important than the amount of time it takes to execute those instructions in the CPU of the block producer. So you should write high performance code.

| improve this answer | |
  • Simply measuring CPU time would not be deterministic, as block producers run on different CPUs. – Mikko Ohtamaa Jul 6 '19 at 11:48
  • Correct. Which is why you sometimes get subjective failures when a transaction lasts longer than 30ms. Depends on the BP – Phillip Hamnett - EOS42 Jul 6 '19 at 12:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.