Home - Summaries: (main) : (py3.11) : (py3.12) : Everything - Nightly builds - Benchmarks - RPython - Builders - About

translator/platform/test/test_makefile.py::TestMakefile::()::test_precompiled_headers

self = <rpython.translator.platform.test.test_makefile.TestMakefile object at 0x000001ac9caa6410>

    def test_precompiled_headers(self):
        if self.platform.cc != 'cl.exe':
            py.test.skip("Only MSVC profits from precompiled headers")
        import time
        tmpdir = udir.join('precompiled_headers').ensure(dir=1)
        # Create an eci that should not use precompiled headers
        eci = ExternalCompilationInfo(include_dirs=[tmpdir])
        main_c = tmpdir.join('main_no_pch.c')
        eci.separate_module_files = [main_c]
        ncfiles = 10
        nprecompiled_headers = 20
        txt = '#include <stdio.h>\n'
        for i in range(ncfiles):
            txt += "int func%03d();\n" % i
        txt += "\n__declspec(dllexport) int\n"
        txt += "pypy_main_startup(int argc, wchar_t * argv[])\n"
        txt += "{\n   int i=0;\n"
        for i in range(ncfiles):
            txt += "   i += func%03d();\n" % i
        txt += '    printf("%d\\n", i);\n'
        txt += "   return 0;\n};\n"
        main_c.write(txt)
        # Create some large headers with dummy functions to be precompiled
        cfiles_precompiled_headers = []
        for i in range(nprecompiled_headers):
            pch_name =tmpdir.join('pcheader%03d.h' % i)
            txt = '#ifndef PCHEADER%03d_H\n#define PCHEADER%03d_H\n' %(i, i)
            for j in range(3000):
                txt += "int pcfunc%03d_%03d();\n" %(i, j)
            txt += '#endif'
            pch_name.write(txt)
            cfiles_precompiled_headers.append(pch_name)
        # Create some cfiles with headers we want precompiled
        cfiles = []
        for i in range(ncfiles):
            c_name =tmpdir.join('implement%03d.c' % i)
            txt = ''
            for pch_name in cfiles_precompiled_headers:
                txt += '#include "%s"\n' % pch_name
            txt += "int func%03d(){ return %d;};\n" % (i, i)
            c_name.write(txt)
            cfiles.append(c_name)
        if sys.platform == 'win32':
            clean = ('clean', '', 'for %f in ( $(OBJECTS) $(TARGET) ) do @if exist %f del /f %f')
            get_time = time.clock
        else:
            clean = ('clean', '', 'rm -f $(OBJECTS) $(TARGET) ')
            get_time = time.time
        #write a non-precompiled header makefile
        mk = self.platform.gen_makefile(cfiles, eci, path=tmpdir, shared=True)
        mk.rule(*clean)
        mk.write()
        t0 = get_time()
        self.platform.execute_makefile(mk)
        t1 = get_time()
        t_normal = t1 - t0
        self.platform.execute_makefile(mk, extra_opts=['clean'])
        # Write a super-duper makefile with precompiled headers
        mk = self.platform.gen_makefile(cfiles, eci, path=tmpdir, shared=True,
                           headers_to_precompile=cfiles_precompiled_headers,)
        mk.rule(*clean)
        mk.write()
        t0 = get_time()
        self.platform.execute_makefile(mk)
        t1 = get_time()
        t_precompiled = t1 - t0
        res = self.platform.execute(mk.exe_name)
        self.check_res(res, '%d\n' %sum(range(ncfiles)))
        #print "precompiled haeder 'make' time %.2f, non-precompiled header time %.2f" %(t_precompiled, t_normal)
>       assert t_precompiled < t_normal
E       assert 4.8245371 < 4.4198729

translator\platform\test\test_makefile.py:143: AssertionError
---------- Captured stderr call ----------
[platform:execute] nmake  in c:\users\runner~1\appdata\local\temp\usession-main-21\precompiled_headers
[platform:execute] nmake clean in c:\users\runner~1\appdata\local\temp\usession-main-21\precompiled_headers
[platform:execute] nmake  in c:\users\runner~1\appdata\local\temp\usession-main-21\precompiled_headers
builder: rpython-win-x86-64 build #808*
test: translator/platform/test/test_makefile.py::TestMakefile::()::test_precompiled_headers