xref: /haiku/src/tests/servers/app/benchmark/StringTest.cpp (revision 5ac9b506412b11afb993bb52d161efe7666958a5)
1 /*
2  * Copyright (C) 2008-2009 Stephan Aßmus <superstippi@gmx.de>
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 
6 #include "StringTest.h"
7 
8 #include <stdio.h>
9 
10 #include <String.h>
11 #include <View.h>
12 
13 #include "TestSupport.h"
14 
15 
16 StringTest::StringTest()
17 	: Test(),
18 	  fTestDuration(0),
19 	  fTestStart(-1),
20 	  fGlyphsRendered(0),
21 	  fGlyphsPerLine(500),
22 	  fIterations(0),
23 	  fMaxIterations(1500),
24 
25 	  fStartHeight(11.0),
26 	  fLineHeight(15.0)
27 {
28 }
29 
30 
31 StringTest::~StringTest()
32 {
33 }
34 
35 
36 void
37 StringTest::Prepare(BView* view)
38 {
39 //	SetupClipping(view);
40 
41 	font_height fh;
42 	view->GetFontHeight(&fh);
43 	fLineHeight = ceilf(fh.ascent) + ceilf(fh.descent)
44 		+ ceilf(fh.leading);
45 	fStartHeight = ceilf(fh.ascent) + ceilf(fh.descent);
46 	fViewBounds = view->Bounds();
47 
48 	BString string;
49 	string.Append('M', fGlyphsPerLine);
50 	while (view->StringWidth(string.String()) < fViewBounds.Width() - 10)
51 		string.Append('M', 1);
52 	while (view->StringWidth(string.String()) > fViewBounds.Width() - 10)
53 		string.Remove(string.Length() - 1, 1);
54 
55 	fGlyphsPerLine = 60; //string.Length();
56 	fTestDuration = 0;
57 	fGlyphsRendered = 0;
58 	fIterations = 0;
59 	fTestStart = system_time();
60 }
61 
62 bool
63 StringTest::RunIteration(BView* view)
64 {
65 	BPoint textLocation;
66 	textLocation.x = 5;
67 	textLocation.y = random_number_between(fStartHeight,
68 		fStartHeight + fLineHeight / 2);
69 
70 	char buffer[fGlyphsPerLine + 1];
71 	buffer[fGlyphsPerLine] = 0;
72 
73 	bigtime_t now = system_time();
74 
75 	while (true) {
76 		// fill string with random chars
77 		for (uint32 j = 0; j < fGlyphsPerLine; j++)
78 			buffer[j] = 'A' + rand() % ('z' - 'A');
79 
80 		view->DrawString(buffer, textLocation);
81 
82 		fGlyphsRendered += fGlyphsPerLine;
83 
84 		// offset text location
85 		textLocation.y += fLineHeight;
86 		if (textLocation.y > fViewBounds.bottom)
87 			break;
88 	}
89 
90 	view->Sync();
91 
92 	fTestDuration += system_time() - now;
93 	fIterations++;
94 
95 	return fIterations < fMaxIterations;
96 }
97 
98 
99 void
100 StringTest::PrintResults(BView* view)
101 {
102 	if (fTestDuration == 0) {
103 		printf("Test was not run.\n");
104 		return;
105 	}
106 	bigtime_t timeLeak = system_time() - fTestStart - fTestDuration;
107 
108 	Test::PrintResults(view);
109 
110 	printf("Glyphs per DrawString() call: %ld\n", fGlyphsPerLine);
111 	printf("Glyphs per second: %.3f\n",
112 		fGlyphsRendered * 1000000.0 / fTestDuration);
113 	printf("Average time between iterations: %.4f seconds.\n",
114 		(float)timeLeak / fIterations / 1000000);
115 }
116 
117 
118 Test*
119 StringTest::CreateTest()
120 {
121 	return new StringTest();
122 }
123 
124