[wpseo_breadcrumb]

How many CPU ticks does it take to store a single None? [closed]

Solutons:


In short: In this case, since X does not implement Drop, storing None is done in a single instruction. The number of CPU cycles depends heavily on the exact hardware and on caching effects. But assuming a modern x86-64 CPU and assuming the memory is in L1 cache (fair assumption for stack memory), it should only be a couple cycles.


To get meaningful assembly out of your program, I added two black_box calls to simulate using the value of your variable. I also made the value inside the array 13 as 0 is often treated in a special case.

let mut x : Option<X> = Some([13; 256]);
std::hint::black_box(&x);
x = None; // how many CPU ticks here?
std::hint::black_box(x);

Compiling that code in the Compiler Explorer gives the following assembly (commented by me):

.LCPI0_0:
    .zero   16,13    ; 16 bytes with value 13

example::foo:
    ; reserve space on the stack
    sub     rsp, 144      

    ; Copy the xmmword (16 bytes) from the constant location LCPI0_0 to the 
    ; register xmm0.
    movaps  xmm0, xmmword ptr [rip + .LCPI0_0]

    ; Copy the register xmm0 (now containing a bunch of 13s) to all these memory 
    ; locations (relative to the rsp register)
    movups  xmmword ptr [rsp + 121], xmm0
    movups  xmmword ptr [rsp + 105], xmm0
    movups  xmmword ptr [rsp + 89], xmm0
    movups  xmmword ptr [rsp + 73], xmm0
    movups  xmmword ptr [rsp + 57], xmm0
    movups  xmmword ptr [rsp + 41], xmm0
    movups  xmmword ptr [rsp + 25], xmm0
    movups  xmmword ptr [rsp + 9], xmm0
    movups  xmmword ptr [rsp - 7], xmm0
    movups  xmmword ptr [rsp - 23], xmm0
    movups  xmmword ptr [rsp - 39], xmm0
    movups  xmmword ptr [rsp - 55], xmm0
    movups  xmmword ptr [rsp - 71], xmm0
    movups  xmmword ptr [rsp - 87], xmm0
    movups  xmmword ptr [rsp - 103], xmm0
    movups  xmmword ptr [rsp - 119], xmm0

    ; Move 1 to that single memory location
    mov     byte ptr [rsp - 120], 1

    ; Prepare parameters for black_box call -> ignore that
    lea     rax, [rsp - 120]
    mov     qword ptr [rsp - 128], rax
    lea     rcx, [rsp - 128]

    ; Write None to the variable  <--- LOOK HERE
    mov     byte ptr [rsp - 120], 0

    ; Prepare parameters for black_box call again -> ignore that
    mov     qword ptr [rsp - 128], rax

    ; Function outro: "clean" stack space and return from function
    add     rsp, 144
    ret

As you can see (assuming you trust my comments), storing a None here takes only one instruction, a mov byte one. This is one of the easiest instructions, but also one of the hardest to estimate the time of. Why? CPU-caching. Assuming the data is in L1 cache, this should be only a couple of CPU cycles. If the memory is not in any cache (unlikely for the stack), then it could take hundreds of cycles.

Also worth noting: this is so simple because the replaced data were just simple bytes and no cleanup was needed. If the T in Option<T> implements Drop, the drop function needs to be called at this point, making it a lot more complicated.

Why can this be done with only one byte stored you ask? Well, enums in Rust (which Option is) are generally stored like this:

┌─────┬─────────────┐  
│ tag │ contents... │  
└─────┴─────────────┘  

The tag, or discriminator, just stores what variant of the enum (None or Some) is currently active. After that, the data area begins, where the data belonging to the active variant is stored.

Related Solutions

Getting last modification date of a PostgreSQL database table

There is no reliable, authorative record of the last modified time of a table. Using the relfilenode is wrong for a lot of reasons: Writes are initially recorded to the write-head log (WAL), then lazily to the heap (the table files). Once the record is in WAL,...

How do I make this sed script a “one liner”?

An ANSI C string -- with $'' -- can contain backslash escapes, like \n -- so you can have a newline in sed's arguments while still having the shell command invoking sed be only one line. sed -i $'/INTERPRETER_PYTHON_DISTRO_MAP/,/version_added/ {\n /default/a\\...

How to OCR a PDF file and get the text stored within the PDF?

ocrmypdf does a good job and can be used like this: ocrmypdf in.pdf out.pdf To install: pip install ocrmypdf or sudo apt install ocrmypdf # ubuntu sudo dnf -y install ocrmypdf # fedora After learning that Tesseract can now also produce searchable PDFs, I found...

If …Else If wont work [closed]

First of all, put the javascript code between a <script></script> tag because javascript code will not run in an html <div></div> tag. Then, instead of x == 0||9||2, use x == 0 || x == 9 || x == 2. Kindly indent your code for easier...

How to convert the object of character to string

Your object of characters is already almost an array. It has numeric indices, but is missing the .length property. If you add that it, it will be an "array like" object, which can then be passed to Array.from to get a proper array. Once you have a real array,...

How can I write the approximate value of PI?

Because your { and } is wrong. I think brackets will be as given below If the formula is PI = 4/1 - 4/3 + 4/5 - 4/7 + ... ( Leibniz's Series ) then you can formalate as given below #include <iostream> using namespace std; int main() { double n, i; //...

c# Regex catch string between two string [duplicate]

You can try this: <[a-z\s]+id=[\'\"]mobile[\w]+[\'\"][\sa-zA-Z\d\'\=\;\:]*>([a-zA-Z\d\s]+)<[\/a-z\s]+> Anyway it will not match special chars or symbols. You can test and optimize it here: https://regex101.com/r/fnYQ1o/10 EDIT - Code example This...

Do I need CSRF token if I’m using Bearer JWT?

This is relevant but doesn't necessarily answer 100% of your question: https://security.stackexchange.com/a/166798/149676 The short of it is that as long as authentication isn't automatic (typically provided by the browser) then you don't have to worry about...

Java cannot find symbol during compiling

The problem is this line: System.out.println(pref); You have not defined pref in this scope. The field pref is only defined in main method but cannot be read outside of it and therefore outside your main method the pref field has to be defined as well. (You may...

HOW TO MAKE A DYNAMIC PROFILE PAGE? [closed]

Well, for such small tasks no CMS (I mean WP or Drupal) is necessarily needed - customizing one for your needs will me much more painful, than adding a few PHP lines to your HTML files. To make your website able to get data, you will have to make it perform...

Weird results in c [closed]

In addition to LihOs answer above this block looks wrong: if(tab1[i] != '\0') tab1[i]==result[i]; else if (tab2[i] !='\0') tab2[i]==result[i]; else printf(" "); Don't you mean to assign the value in tab1[i]or tab2[i] to result[i]like this? if(tab1[i] != '\0')...

Notepad in windows form application [closed]

This should demonstrate how to open Notepad and put text into it. This is a simple example of starting a Notepad process and then adding text to it. Will open a new Notepad.exe process and then add the text "Sending a message, a message from me to you" to the...

Check whether number is even or odd without using any operator

I think you are talking about no arithmetic operator In this case you can ask yourself, in binary what represents the least significant bit (bit 0)? So you can test that bit to know if a number is odd or even: if (number & 0x01) { // odd number } else { //...

What is the output of the program with reason?

See annotations: #include <stdio.h> void f(int *p, int *q) // p contains address of i, q contains address of j { p=q; // p now contains address of j *p=2; // assigns 2 to j, not i } int main() { int i=0,j=1; // i contains 0, j contains 1 f( &i, &j...

Relative imports for the billionth time

Script vs. Module Here's an explanation. The short version is that there is a big difference between directly running a Python file, and importing that file from somewhere else. Just knowing what directory a file is in does not determine what package Python...