[LNT] r264152 - [profile] Add a new method: saveFromRendered
James Molloy via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 23 04:37:17 PDT 2016
Author: jamesm
Date: Wed Mar 23 06:37:17 2016
New Revision: 264152
URL: http://llvm.org/viewvc/llvm-project?rev=264152&view=rev
Log:
[profile] Add a new method: saveFromRendered
This is equivalent to Profile.fromRendered().save(), except that it skips the intermediate deserialize/serialize pair which makes it *substantially* quicker.
95% of the time of saving a profile comes from the serialize step, where lookup tables are reconstructed (assuming the underlying data might have changed). If we skip this step and just simple b64decode and dump to disk, we're massively quicker.
Modified:
lnt/trunk/lnt/server/db/testsuitedb.py
lnt/trunk/lnt/testing/profile/profile.py
lnt/trunk/tests/testing/profilev1impl.py
Modified: lnt/trunk/lnt/server/db/testsuitedb.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/db/testsuitedb.py?rev=264152&r1=264151&r2=264152&view=diff
==============================================================================
--- lnt/trunk/lnt/server/db/testsuitedb.py (original)
+++ lnt/trunk/lnt/server/db/testsuitedb.py Wed Mar 23 06:37:17 2016
@@ -340,12 +340,13 @@ class TestSuiteDB(object):
def __init__(self, encoded, config, testid):
self.created_time = datetime.datetime.now()
self.accessed_time = datetime.datetime.now()
-
- p = profile.Profile.fromRendered(encoded)
+
if config is not None:
- self.filename = p.save(profileDir=config.config.profileDir,
- prefix='t-%s-s-' % os.path.basename(testid))
+ self.filename = Profile.saveFromRendered(encoded,
+ profileDir=config.config.profileDir,
+ prefix='t-%s-s-' % os.path.basename(testid))
+ p = profile.Profile.fromRendered(encoded)
s = ','.join('%s=%s' % (k,v)
for k,v in p.getTopLevelCounters().items())
self.counters = s[:512]
Modified: lnt/trunk/lnt/testing/profile/profile.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/testing/profile/profile.py?rev=264152&r1=264151&r2=264152&view=diff
==============================================================================
--- lnt/trunk/lnt/testing/profile/profile.py (original)
+++ lnt/trunk/lnt/testing/profile/profile.py Wed Mar 23 06:37:17 2016
@@ -54,6 +54,32 @@ class Profile(object):
return None
raise RuntimeError('No profile implementations could read this file!')
+ @staticmethod
+ def saveFromRendered(s, filename=None, profileDir=None, prefix=''):
+ """
+ Load a profile from a string, which must have been produced
+ with Profile.render(), and save it immediately in filename.
+
+ This is equivalent to Profile.fromRendered(s).save(filename=filename)
+ but it avoids the intermediate deserialize/serialize steps.
+ """
+ s = base64.b64decode(s)
+
+ if not filename:
+ assert profileDir is not None
+ if not os.path.exists(profileDir):
+ os.makedirs(profileDir)
+ tf = tempfile.NamedTemporaryFile(prefix=prefix,
+ suffix='.lntprof',
+ dir=profileDir,
+ delete=False)
+ tf.write(s)
+ return tf.name
+
+ else:
+ open(filename, 'w').write(s)
+ return filename
+
def save(self, filename=None, profileDir=None, prefix=''):
"""
Save a profile. One of 'filename' or 'profileDir' must be given.
Modified: lnt/trunk/tests/testing/profilev1impl.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/tests/testing/profilev1impl.py?rev=264152&r1=264151&r2=264152&view=diff
==============================================================================
--- lnt/trunk/tests/testing/profilev1impl.py (original)
+++ lnt/trunk/tests/testing/profilev1impl.py Wed Mar 23 06:37:17 2016
@@ -1,7 +1,7 @@
# RUN: python %s
import unittest, logging, sys, copy, tempfile, io
from lnt.testing.profile.profilev1impl import ProfileV1
-
+from lnt.testing.profile.profile import Profile
logging.basicConfig(level=logging.DEBUG)
@@ -41,5 +41,15 @@ class ProfileV1Test(unittest.TestCase):
{'fn1': {'counters': {'cycles': 45.0, 'branch-misses': 10.0},
'length': 2}})
+ def test_saveFromRendered(self):
+ p = ProfileV1(copy.deepcopy(self.test_data))
+ s = Profile(p).render()
+
+ with tempfile.NamedTemporaryFile() as f:
+ Profile.saveFromRendered(s, filename=f.name)
+ p2 = ProfileV1.deserialize(open(f.name))
+
+ self.assertEqual(p2.data, self.test_data)
+
if __name__ == '__main__':
unittest.main(argv=[sys.argv[0], ])
More information about the llvm-commits
mailing list