call_end

    • Pl chevron_right

      Steven Deobald: 2025-07-25 Foundation Update

      news.movim.eu / PlanetGnome • 29 July • 2 minutes

    ## Annual Report

    The 2025 Annual Report is all-but-baked. Deepa and I would like to be completely confident in the final financial figures before publishing. The Board has seen these final numbers, during their all-day work day two days ago. I heard from multiple Board members that they’re ecstatic with how Deepa presented the financial report. This was a massive amount of work for Deepa to contribute in her first month volunteering as our new Treasurer and we all really appreciate the work that she’s put into this.

    ## GUADEC and Gratitude

    I’ve organized large events before and I know in my bones how difficult and tiresome it can be. But I don’t think I quite understood the scale of GUADEC. I had heard many times in the past three months “you just have to experience GUADEC to understand it” but I was quite surprised to find the day before the conference so intense and overwhelming that I was sick in bed for the entire first day of the conference — and that’s as an attendee!

    The conference takes the firehose of GNOME development and brings it all into one place. So many things happened here, I won’t attempt to enumerate them all. Instead, I’d like to talk about the energy.

    I have been pretty disoriented since the moment I landed in Italy but, even in my stupor, I was carried along by the energy of the conference. I could see that I wasn’t an exception — everyone I talked to seemed to be sleeping four hours a night but still highly energized, thrilled to take part, to meet their old friends, and to build GNOME together. My experience of the conference was a constant stream of people coming up to me, introducing themselves, telling me their stories, and sharing their dreams for the project. There is a real warmth to everyone involved in GNOME and it radiates from people the moment you meet them. You all made this a very comfortable space, even for an introvert like me.

    There is also incredible history here: folks who have been around for 5 years, 15 years, 25 years, 30 years. Lifelong friends like that are rare and it’s special to witness, as an outsider.

    But more important than anything I have to say about my experience of the conference, I want to proxy the gratitude of everyone I met. Everyone I spoke to, carried through the unbroken days on the energy of the space, kept telling me what a wonderful GUADEC it was. “The best GUADEC I’ve ever been to.” / “It’s so wonderful to meet the local community.” / “Everything is so smooth and well organized.”

    If you were not here and couldn’t experience it yourself, please know how grateful we all are for the hard work of the staff and volunteers. Kristi, for tirelessly managing the entire project and coordinating a thousand variables, from the day GUADEC 2024 ended until the moment she opened GUADEC 2025. Rosanna, for taking time away from all her regular work at the Foundation to give her full attention to the event. Pietro, for all the local coordination before the conference and his attention to detail throughout the conference. And the local/remote volunteer team — Maria, Deepesha, Ashmit, Aryan, Alessandro, and Syazwan — for openly and generously participating in every conceivable way.

    Thank you everyone for making such an important event possible.

    • Pl chevron_right

      Christian Hergert: Week 30 Status

      news.movim.eu / PlanetGnome • 28 July • 7 minutes

    My approach to engineering involves an engineers notebook and pen at my side almost all the time. My ADHD is so bad that without writing things down I would very much not remember what I did.

    Working at large companies can have a silencing effect on engineers in the community because all our communication energy is burnt on weekly status reports. You see this all the time, and it was famously expected behavior when FOSS people joined Google.

    But it is not unique to Google and I certainly suffer from it myself. So I’m going to try to experiment for a while dropping my status reports here too, at least for the things that aren’t extremely specific to my employer.

    Open Questions

    • What is the state-of-the-art right now for “I want to provide a completely artisan file-system to a container”. For example, say I wanted to have a FUSE file-system for that build pipeline or other tooling accessed.

      At least when it comes to project sources. Everything else should be read-only anyway.

      It would be nice to allow tooling some read/write access but gate the writes so they are limited to the tools running and not persistent when the tool returns.

    Foundry

    • A bit more testing of Foundry’s replacement for Jsonrpc-GLib, which is a new libdex based FoundryJsonrpcDriver . It knows how to talk a few different types (HTTP-style, \0 or \n delimited, etc).

      LSP backend has been ported to this now along with all the JSON node creating helpers so try to put those through their paces.

    • Add pre-load/post-load to FoundryTextDocumentAddin so that we can add hooks for addins early in the loading process. We actually want this more for avoiding things during buffer loading.

    • Found a nasty issue where creating addins was causing long running leaks do to the GParameter arrays getting saved for future addin creation. Need to be a bit more clever about initial property setup so that we don’t create this reference cycle.

    • New word-completion plugin for Foundry that takes a different approach from what we did in GtkSourceView. Instead, this runs on demand with a copy of the document buffer on a fiber on a thread. This allows using regex for word boundaries ( \w ) with JIT, no synchronization with GTK, and just generally _a lot_ faster. It also allowed for following referenced files from #include style style headers in C/C++/Obj-C which is something VIM does (at least with plugins) that I very much wanted.

      It is nice knowing when a symbol comes from the local file vs an included file as well (again, VIM does this) so I implemented that as well for completeness.

      Make sure it does word de-duplication while I’m at it.

    • Preserve completion activation (user initialized, automatic, etc) to propagate to the completion providers.

    • Live diagnostics tracking is much easier now. You can just create a FoundryOnTypeDiagnostics(document) and it will manage updating things as you go. It is also smart enough to do this with GWeakRef so that we don’t keep underlying buffers/documents/etc alive past the point they should be unloaded (as the worker runs on a fiber).

      You can share a single instance of the live diagnostics using foundry_text_document_watch_diagnostics() to avoid extra work.

    • Add a Git-specific clone API in FoundryGitClone which handles all the annoying things like SSH authentication/etc via the use of our prompt abstraction (TTY, app dialog, etc). This also means there is a new foundry clone ... CLI command to test that infrastructure outside of the IDE. Should help for tracking down weird integration issues.

    • To make the Git cloner API work well I had to remove the context requirement from FoundryAuthPrompt . You’ll never have a loaded context when you want to clone (as there is not yet a project) so that requirement was nonsensical.

    • Add new foundry_vcs_list_commits_with_file() API to get the commit history on a single file. This gives you a list model of FoundryCommit which should make it very easy for applications to browse through file history. One call, bridge the model to a listview and wire up some labels.

    • Add FoundryVcsTree , FoundryVcsDiff , FoundryVcsDelta types and git implementations of them. Like the rest of the new Git abstractions, this all runs threaded using libdex and futures which complete when the thread returns. Still need to iterate on this a bit before the 1.0 API is finalized.

    • New API to generate diffs from trees or find trees by identifiers.

    • Found out that libgit2 does not support the bitmap index of the command line git command. That means that you have to do a lot of diffing to determine what commits contain a specific file. Maybe that will change in the future though. We could always shell out to the git command for this specific operation if it ends up too slow.

    • New CTags parser that allows for read-only memory. Instead of doing the optimization in the past (insert \0 and use strings in place) the new index keeps string offset/run for a few important parts.

      Then the open-coded binary search to find the nearest partial match against (then walking backward to get first potential match) can keep that in mind for memcmp() .

      We can also send all this work off to the thread pools easily now with libdex/futures.

      Some work still remains if we want to use CTags for symbol resolution but I highly doubt we do.

      Anyway, having CTags is really more just about having an easy test case for the completion engine than “people will actually use this”.

    • Also write a new CTags miner which can build CTags files using whatever ctags engine is installed (universal-ctags, etc). The goal here is, again, to test the infrastructure in a super easy way rather than have people actually use this.

    • A new FoundrySymbolProvider and FoundrySymbol API which allows for some nice ergonomics when bridging to tooling like LSPs.

      It also makes it a lot easier to implement features like pathbars since you can foundry_symbol_list_to_root() and get a future-populated GListModel of the symbol hierarchy. Attach that to a pathbar widget and you’re done.

    Foundry-GTK

    • Make FoundrySourceView final so that we can be a lot more careful about life-cycle tracking of related documents, buffers, and addins.

    • Use FoundryTextDocumentAddin to implement spellchecking with libspelling as it vastly improves life-cycle tracking. We no longer rely on UB in GLib weak reference notifications to do cleanup in the right order.

    • Improve the completion bridge from FoundryCompletionProvider to GtkSourceCompletionProvider . Particularly start on after / comment fields. We still need to get before fields setup for return types.

      Still extremely annoyed at how LSP works in this regards. I mean really, my rage that LSP is what we have has no bounds. It’s terrible in almost every way imaginable.

    Builder

    • Make my Builder rewrite use new FoundrySourceView

    • Rewrite search dialog to use FoundrySearchEngine so that we can use the much faster VCS-backed file-listing + fuzzy search.

    GtkSourceView

    • Got a nice patch for porting space drawing to GskPath, merged it.

    • Make Ctrl+n/Ctrl+p work in VIM emulation mode.

    Sysprof

    • Add support for building introspection/docs. Don’t care about the introspection too much, because I doubt anyone would even use it. But it is nice to have documentation for potential contributors to look at how the APIs work from a higher level.

    GUADEC

    • Couldn’t attend GUADEC this year, so wrote up a talk on Foundry to share with those that are interested in where things are going. Given the number of downloads of the PDF, decided that maybe sharing my weekly status round-up is useful.

    • Watched a number of videos streamed from GUADEC. While watching Felipe demo his new boxes work, I fired up the repository with foundry and things seem to work on aarch64 (Asahi Fedora here).

      That was the first time ever I’ve had an easy experience running a virtual machine on aarch64 Linux. Really pleasing!

    foundry clone https://gitlab.gnome.org/felipeborges/boxes/
    cd boxes/
    foundry init
    foundry run

    LibMKS

    • While testing Boxes on aarch64 I noticed it is using the Cairo framebuffer fallback paintable. That would be fine except I’m running on 150% here and when I wrote that code we didn’t even have real fractional scaling in the Wayland protocol defined.

      That means there are stitch marks showing up for this non-accelerated path. We probably want to choose a tile-size based on the scale- factor and be done with it.

      The accelerated path shouldn’t have this problem since it uses one DMABUF paintable and sets the damage regions for the GSK renderer to do proper damage calculation.

    • Pl chevron_right

      Bastien Nocera: Digitising CDs (aka using your phone as an image scanner)

      news.movim.eu / PlanetGnome • 27 July • 3 minutes

    I recently found, under the rain, next to a book swap box, a pile of 90's “software magazines” which I spent my evening cleaning, drying, and sorting in the days afterwards.

    Magazine cover CDs with nary a magazine

    Those magazines are a peculiar thing in France, using the mechanism of “ Commission paritaire des publications et des agences de presse ” or “Commission paritaire” for short. This structure exists to assess whether a magazine can benefit from state subsidies for the written press (whether on paper at the time, and also the internet nowadays), which include a reduced VAT charge (2.1% instead of 20%), reduced postal rates, and tax exemptions .

    In the 90s, this was used by Diamond Editions[1] (a publisher related to tech shop Pearl , which French and German computer enthusiasts probably know) to publish magazines with just enough original text to qualify for those subsidies, bundled with the really interesting part, a piece of software on CD.

    If you were to visit a French newsagent nowadays, you would be able to find other examples of this: magazines bundled with music CDs, DVDs or Blu-rays, or even toys or collectibles. Some publishers (including the infamous and now shuttered Éditions Atlas ) will even get you a cheap kickstart to a new collection, with the first few issues (and collectibles) available at very interesting prices of a couple of euros, before making that “magazine” subscription-only, with each issue being increasingly more expensive ( article from a consumer protection association ).


    Other publishers have followed suite.

    I guess you can only imagine how much your scale model would end up costing with that business model (50 eurocent for the first part, 4.99€ for the second), although I would expect them to have given up the idea of being categorised as “written press”.

    To go back to Diamond Editions, this meant the eventual birth of 3 magazines: Presqu'Offert , BestSellerGames and StratéJ . I remember me or my dad buying a few of those, an older but legit and complete version of ClarisWorks, CorelDraw or a talkie version of a LucasArt point'n'click was certainly a more interesting proposition than a cut-down warez version full of viruses when budget was tight.

    3 of the magazines I managed to rescue from the rain

    You might also be interested in the UK “covertape wars” .

    Don't stress the technique

    This brings us back to today and while the magazines are still waiting for scanning, I tried to get a wee bit organised and digitising the CDs.

    Some of them will have printing that covers the whole of the CD, a fair few use the foil/aluminium backing of the CD as a blank surface, which will give you pretty bad results when scanning them with a flatbed scanner: the light source keeps moving with the sensor, and what you'll be scanning is the sensor's reflection on the CD.

    My workaround for this is to use a digital camera (my phone's 24MP camera), with a white foam board behind it, so the blank parts appear more light grey. Of course, this means that you need to take the picture from an angle, and that the CD will appear as an oval instead of perfectly circular.

    I tried for a while to use GIMP perspective tools, and “Multimedia” Mike Melanson's MobyCAIRO rotation and cropping tool. In the end, I settled on Darktable, which allowed me to do 4-point perspective deskewing, I just had to have those reference points.

    So I came up with a simple "deskew" template , which you can print yourself, although you could probably achieve similar results with grid paper.

    My janky setup

    The resulting picture

    After opening your photo with Darktable, and selecting the “ darkroom ” tab, go to the “ rotate and perspective tool ”, select the “manually defined rectangle” structure, and select the 4 center of the deskewing target. Then click on horizontal/vertical fit. This will give you a squished CD, don't worry, and select the “specific” lens model and voilà.

    Tools at the ready

    Targets acquired


    Straightened but squished

    You can now export the processed image (I usually use PNG to avoid data loss at each step), open things up in GIMP and use the ellipse selection tool to remove the background (don't forget the center hole), the rotate tool to make the writing straight, and the crop tool to crop it to size.

    And we're done!


    The result of this example is available on Archive.org, with the rest of my uploads being made available on Archive.org and Abandonware-Magazines for those 90s magazines and their accompanying CDs.

    [1]: Full disclosure, I wrote a couple of articles for Linux Pratique and Linux Magazine France in the early 2000s, that were edited by that same company.

    • Pl chevron_right

      Sam Thursfield: Thoughts during GUADEC 2025

      news.movim.eu / PlanetGnome • 26 July • 5 minutes

    Greetings readers of the future from my favourite open technology event of the year. I am hanging out with the people who develop the GNOME platform talking about interesting stuff.

    Being realistic, I won’t have time to make a readable writeup of the event. So I’m going to set myself a challenge: how much can I write up of the event so far, in 15 minutes?

    Let’s go!

    Conversations and knowledge

    Conferences involve a series of talks, usually monologues on different topics, with slides and demos. A good talk leads to multi-way conversations.

    One thing I love about open source is: it encourages you to understand how things work. Big tech companies want you to understand nothing about your devices beyond how to put in your credit card details and send them money. Sharing knowledge is cool, though. If you know how things work then you can fix it yourself.

    Structures

    Last year, I also attended the conference and was left with a big question for the GNOME project: “What is our story?” (Inspired by an excellent keynote from Ryan Sipes about the Thunderbird email app, and how it’s supported by donations).

    We didn’t answer that directly, but I have some new thoughts.

    Open source desktops are more popular than ever. Apparently we have like 5% of the desktop market share now. Big tech firms are nowadays run as huge piles of cash, whose story is that they need to make more cash, in order to give it to shareholders, so that one day you can, allegedly, have a pension. Their main goal isn’t to make computers do interesting things. The modern for-profit corporation is a super complex institution, with great power, which is often abused.

    Open communities like GNOME are an antidote to that. With way fewer people, they nevertheless manage to produce better software in many cases, but in a way that’s demanding, fun, chaotic, mostly leaderless and which frequently burns out volunteers who contribute.

    Is the GNOME project’s goal to make computers do interesting things? For me, the most interesting part of the conference so far was the focus on project structure . I think we learned some things about how independent, non-profit communities can work, and how they can fail, and how we can make things better.

    In a world where political structures are being heavily tested and, in many cases, are crumbling, we would do well to talk more about structures, and to introspect a bit more on what works and what doesn’t. And to highlight the amazing work that the GNOME Foundation’s many volunteer directors have achieved over the last 30 years to create an institution that still functions today, and in many ways functions a lot better than organizations with significantly more resources.

    Relevant talks

    • Stephen Deobold’s keynote
    • Emmanuele’s talk on teams

    Teams

    Emmanuele Bassi tried, in a friendly way, to set fire to long-standing structures around how the GNOME community agrees and disagrees changes to the platform. Based on ideas from other successful projects that are driven by independent, non-profit communities such as the Rust and Python programming languages.

    Part of this idea is to create well-defined teams of people who collaborate on different parts of the GNOME platform.

    I’ve been contributing to GNOME in different ways for a loooong time, partly due to my day job, where I sometimes work with the technology stack, and partly because its a great group of people, we get to meet around the world once a year, and make software that’s a little more independent from the excesses and the exploitation of modern capitalism, or technofuedalism.

    And I think it’s going to be really helpful to organize my contributions according to a team structure with a defined form.

    Search

    I really hope we’ll have a search team.

    I don’t have much news about search. GNOME’s indexer (localsearch) might start indexing the whole home directory soon. Carlos Garnacho continues to heroically make it work really well.

    QA / Testing / Developer Experience

    I did a talk at the conference (and half of another one with Martín Abente Lahaye) , about end-to-end testing using openQA.

    The talks were pretty successful, they lead to some interesting conversations with new people. I hope we’ll continue to grow the Linux QA call and try to keep these conversations going, and try to share knowledge and create better structures so that paid QA engineers who are testing products built with GNOME can collaborate on testing upstream.

    Freeform notes

    I’m 8 minutes over time already so the rest of this will be freeform notes from my notepad.

    Live-coding streams aren’t something I watch or create. It’s an interesting way to share knowledge with the new generation of people who have grown up with internet videos as a primary knowledge source. I don’t have age stats for this blog, but I’m curious how many readers under 30 have read this far down. (Leave a comment if you read this and prove me wrong! : -)

    systemd-sysexts for development are going to catch on.

    There should be karaoke every year.

    Fedora Silverblue isn’t actively developed at the moment. bootc is something to keep an eye on.

    GNOME Shell Extensions are really popular and are a good “gateway drug” to get newcomers involved. Nobody figured out a good automated testing story for these yet. I wonder if there’s a QA project there? I wonder if there’s a low-cost way to allow extension developers to test extensions?

    Legacy code is “code without tests”. I’m not sure I agree with that.

    “Toolkits are transient, apps are forever”. That’s spot-on.

    There is a spectrum between being a user and a developer. It’s not a black-and-white distinction.

    BuildStream is still difficult to learn and the documentation isn’t a helpful getting started guide for newcomers.

    We need more live demos of accessibility tools. I still don’t know how you use the screen reader. I’d like to have the computer read to me.

    That’s it for now. It took 34 minutes to empty my brain into my blog, more than planned, but a necessary step. Hope some of it was interesting. See you soon!

    • Pl chevron_right

      Nancy Wairimu Nyambura: Outreachy Update:Understanding and Improving def-extractor.py

      news.movim.eu / PlanetGnome • 25 July • 2 minutes

    Introduction

    Over the past couple of weeks, I have been working on understanding and improving def-extractor.py , a Python script that processes dictionary data from Wiktionary to generate word lists and definitions in structured formats. My main task has been to refactor the script to use configuration files instead of hardcoded values, making it more flexible and maintainable.

    In this blog post, I’ll explain:

    1. What the script does
    2. How it works under the hood
    3. The changes I made to improve it
    4. Why these changes matter

    What Does the Script Do?

    At a high level, this script processes huge JSONL (JSON Lines) dictionary dumps, like the ones from Kaikki.org , and filters them down into clean, usable formats.

    The def-extractor.py script takes raw dictionary data (from Wiktionary) and processes it into structured formats like:

    • Filtered word lists (JSONL)
    • GVariant binary files (for efficient storage)
    • Enum tables (for parts of speech & word tags)

    It was originally designed to work with specific word lists (Wordnik, Broda, and a test list), but my goal is to make it configurable so it could support any word list with a simple config file.

    How It Works (Step by Step)

    1. Loading the Word List

    The script starts by loading a word list (e.g., Wordnik’s list of common English words). It filters out invalid words (too short, contain numbers, etc.) and stores them in a hash table for quick lookup.

    2. Filtering Raw Wiktionary Data

    Next, it processes a massive raw-wiktextract-data.jsonl file (theWiktionary dump) and keeps only entries that:

    • Match words from the loaded word list
    • Are in the correct language (e.g., English)

    3. Generating Structured Outputs

    After filtering, the script creates:

    • Enum tables (JSON files listing parts of speech & word tags)
    • GVariant files (binary files for efficient storage and fast lookup)

    What Changes have I Made?

    1. Added Configuration Support

    Originally, the script uses hardcoded paths and settings. I modified it to read from .config files , allowing users to define:

    • Source word list file
    • Output directory
    • Word validation rules (min/max length, allowed characters)

    Before (Hardcoded):

    WORDNIK_LIST = "wordlist-20210729.txt"
    ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    After (Configurable):

    ini

    [Word List]
    Source = my-wordlist.txt
    MinLength = 2
    MaxLength = 20

    2. Improved File Path Handling

    Instead of hardcoding paths, the script now constructs them dynamically:

    output_path = os.path.join(config.word_lists_dir, f"{config.id}-filtered.jsonl")

    Why Do These Changes Matter?

    Flexibility -Now supports any word list via config files.
    Maintainability – No more editing code to change paths or rules.
    Scalability -Easier to add new word lists or languages.
    Consistency -All settings are in configs.

    Next Steps?

    1. Better Error Handling

    I am working on adding checks for:

    • Missing config fields
    • Invalid word list files
    • Incorrectly formatted data

    2. Unified Word Loading Logic

    There are separate functions ( load_wordnik() , load_broda() ).

    I want to merged them into one load_words(config) that would works for any word list.

    3. Refactor legacy code for better structure

    Try It Yourself

    1. Download the script: [ wordlist-Gitlab ]
    2. Create a . conf config file
    3. Run: python3 def-extractor.py --config my-wordlist.conf filtered-list

    Happy coding!

    • Pl chevron_right

      Philip Withnall: A brief parental controls update

      news.movim.eu / PlanetGnome • 24 July

    Over the past few weeks, Ignacy and I have made good progress on the next phase of features for parental controls in GNOME: a refresh of the parental controls UI, support for screen time limits for child accounts, and basic web filtering support are all in progress. I’ve been working on the backend stuff, while Ignacy has been speedily implementing everything needed in the frontend.

    Ignacy is at GUADEC, so please say hi to him! The next phase of parental controls work will involve changes to gnome-control-center and gnome-shell, so he’ll be popping up all over the stack.

    I’ll try and blog more soon about the upcoming features and how they’re implemented, because there are necessarily quite a few moving parts to them.

    • Pl chevron_right

      Michael Meeks: 2025-07-23 Wednesday

      news.movim.eu / PlanetGnome • 23 July

    • Mail chew, research.
    • Published the next strip around investing in the future and making a splash:
    • Somehow this afternoon & evening is an highly contended zone for meetings - Collabora monthly management call, GNOME Advisory Board, Customer call and TDF Advisory Board all competing for the same slot.
    • Band practice in the evening.
    • Pl chevron_right

      Christian Hergert: The Foundry of Builder

      news.movim.eu / PlanetGnome • 23 July

    I won’t be traveling this summer for GUADEC, so here is a quick rundown of what I would talk about if I were there.

    Personally, I feel like Foundry has the potential to be far more useful than Builder alone. This is probably a good time to write about how it got here and where I intend to take it. Hopefully with your help!

    A screenshot of the title page of the presentation, which is likely more accessible than this web page. Read the Slides Here
    • Pl chevron_right

      Jussi Pakkanen: Comparing a red-black tree to a B-tree

      news.movim.eu / PlanetGnome • 23 July • 2 minutes

    In an earlier blog post we found that optimizing the memory layout of a red-black tree does not seem to work . A different way of implementing an ordered container is to use a B-tree. It was originally designed to be used for on-disk data. The design principle was that memory access is "instant" while disk access is slow. Nowadays this applies to memory access as well, as cache hits are "instant" and uncached memory is slow.

    I implemented a B-tree in Pystd . Here is how all the various containers compare. For test data we used numbers from zero to one million in a random order.


    As we can see, an unordered map is massively faster than any ordered container. If your data does not need to be ordered, that is the one you should use. For ordered data, the B-tree is clearly faster than either red-black tree implementation.

    Tuning the B-tree

    B-trees have one main tunable parameter, namely the spread factor of the nodes. In the test above it was five, but for on disk purposes the recommended value is "in the thousands". Here's how altering the value affects performance.


    The sweet spot seems to be in the 256-512 range, where the operations are 60% faster than standard set . As the spread factor grows towards infinity, the B-tree reduces to just storing all data in a single sorted array. Insertion into that is an O(N^2) algorithm as can be seen here.

    Getting weird

    The B-tree implementation has many assert calls to verify the internal structures. We can compile the code with -DNDEBUG to make all those asserts disappear. Removing redundant code should make things faster, so let's try it.

    There are 13 measurements in total and disabling asserts (i.e. enabling NDEBUG ) makes the code run slower in 8 of those cases. Let's state that again, since it is very unexpected: in this particular measurement code with assertions enabled runs faster than the same code without them. This should not be happening. What could be causing it?

    I don't know for sure, so here is some speculation instead.

    First of all a result of 8/13 is probably not statistically significant to say that enabling assertions makes things faster. OTOH it does mean that enabling them does not make the code run noticeably slower. So I guess we can say that both ways of building the code are approximately as fast.

    As to why that is, things get trickier. Maybe GCC's optimizer is just really good at removing unnecessary checks. It might even be that the assertions give the compiler more information so it can skip generating code for things that can never happen. I'm not a compiler engineer, so I'll refrain from speculating further, it would probably be wrong in any case.