https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86471

            Bug ID: 86471
           Summary: GCC/libstdc++ outputs inferior code for std::fill and
                    std::fill_n vs std::memset on c-style arrays
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mattreecebentley at gmail dot com
  Target Milestone: ---

Test setup: 
============
Xubuntu 18, Core2Duo E8500 CPU, GCC 7.3



Results in release mode (-O2 -march=native):
=============================================

2018-07-10 21:28:11
Running ./google_benchmark_test
Run on (2 X 3800.15 MHz CPU s)
CPU Caches:
  L1 Data 32K (x2)
  L1 Instruction 32K (x2)
  L2 Unified 6144K (x1)
-----------------------------------------------------
Benchmark              Time           CPU Iterations
-----------------------------------------------------
memory_filln       16488 ns      16477 ns      42460
memory_fill        16493 ns      16493 ns      42440
memory_memset       8414 ns       8408 ns      83022



Results in debug mode (-O0):
=============================

2018-07-10 21:48:09
Running ./google_benchmark_test
Run on (2 X 3800.15 MHz CPU s)
CPU Caches:
  L1 Data 32K (x2)
  L1 Instruction 32K (x2)
  L2 Unified 6144K (x1)
-----------------------------------------------------
Benchmark              Time           CPU Iterations
-----------------------------------------------------
memory_filln       87209 ns      87139 ns       8029
memory_fill        94593 ns      94533 ns       7411
memory_memset       8441 ns       8434 ns      82833




Code:
======

// Uses Google Benchmark. Rearrange the code any way you want, results stay
similar:
#include <cstring>
#include <algorithm>
#include <benchmark/benchmark.h>


static void memory_memset(benchmark::State& state)
{
        int ints[50000];

        for (auto _ : state)
        {
                std::memset(ints, 0, sizeof(int) * 50000);
        }
}


static void memory_filln(benchmark::State& state)
{
        int ints[50000];

        for (auto _ : state)
        {
                std::fill_n(ints, 50000, 0);
        }
}


static void memory_fill(benchmark::State& state)
{
        int ints[50000];

        for (auto _ : state)
        {
                std::fill(std::begin(ints), std::end(ints), 0);
        }
}


// Register the function as a benchmark
BENCHMARK(memory_filln);
BENCHMARK(memory_fill);
BENCHMARK(memory_memset);



int main (int argc, char ** argv)
{
    benchmark::Initialize (&argc, argv);
    benchmark::RunSpecifiedBenchmarks ();
    return 0;
}

Reply via email to