sealedの効用なんてパフォーマンス面で出るわけも無く・・・
実験しても誤差レベルだしなぁ。
それよりも継承リストを追っかけさせる作業が以外に重たい作業であることがびっくり。
ref class CXX1 sealed
{
public:
virtual void Output()
{
}
};
/*
ref class CXX2 : CXX1 {public: virtual void Output() override { }};
ref class CXX3 : CXX2 {public: virtual void Output() override { }};
ref class CXX4 : CXX3 {public: virtual void Output() override { }};
ref class CXX5 : CXX4 {public: virtual void Output() override { }};
ref class CXX6 : CXX5 {public: virtual void Output() override { }};
ref class CXX7 : CXX6 {public: virtual void Output() override { }};
ref class CXX8 : CXX7 {public: virtual void Output() override { }};
ref class CXX9 : CXX8 {public: virtual void Output() override { }};
ref class CXX10 sealed: CXX9 {public: virtual void Output() override { }};
*/
int main()
{
System::Diagnostics::Stopwatch st;
for ( int atk = 0; atk < 30; atk++)
{
st.Reset();
st.Start();
for ( int i = 0; i < 100000000; i++ )
{
CXX1^ tmp = gcnew CXX1();
tmp->Output();
}
st.Stop();
System::Console::WriteLine(st.ElapsedMilliseconds);
}
System::Console::ReadLine();
}
| 10個の継承リストを追っかけさせる |
1個の実体 |
| non-sealed |
sealed |
sealed |
| 1286 |
1293 |
957 |
| 1346 |
1393 |
972 |
| 1349 |
1385 |
1014 |
| 1344 |
1372 |
1006 |
| 1345 |
1385 |
1001 |
| 1345 |
1382 |
996 |
| 1355 |
1366 |
1008 |
| 1293 |
1289 |
1003 |
| 1261 |
1267 |
1006 |
| 1263 |
1275 |
992 |
| 1262 |
1290 |
929 |
| 1268 |
1281 |
929 |
| 1262 |
1270 |
928 |
| 1264 |
1277 |
928 |
| 1261 |
1268 |
930 |
| 1263 |
1270 |
930 |
| 1262 |
1262 |
929 |
| 1260 |
1258 |
927 |
| 1261 |
1276 |
929 |
| 1262 |
1264 |
929 |
| 1259 |
1259 |
929 |
| 1261 |
1260 |
930 |
| 1261 |
1259 |
941 |
| 1262 |
1257 |
940 |
| 1262 |
1260 |
929 |
| 1261 |
1259 |
929 |
| 1259 |
1261 |
937 |
| 1260 |
1260 |
955 |
| 1261 |
1265 |
952 |
| 1262 |
1260 |
938 |
| 1280.666667 |
1290.76667 |
954.1 |
30%増しくらい10継承を追いかけるのはコストがかかっています。