diff --git a/modules/core/include/opencv2/core/types_c.h b/modules/core/include/opencv2/core/types_c.h
index 68164fa923..11dbabfa7e 100644
--- a/modules/core/include/opencv2/core/types_c.h
+++ b/modules/core/include/opencv2/core/types_c.h
@@ -259,6 +259,10 @@ enum {
 *                             Common macros and inline functions                         *
 \****************************************************************************************/
 
+#ifdef HAVE_TEGRA_OPTIMIZATION
+# include "tegra_round.hpp"
+#endif
+
 #define CV_PI   3.1415926535897932384626433832795
 #define CV_LOG2 0.69314718055994530941723212145818
 
@@ -300,7 +304,11 @@ CV_INLINE  int  cvRound( double value )
     }
     return t;
 #elif defined HAVE_LRINT || defined CV_ICC || defined __GNUC__
+# ifdef HAVE_TEGRA_OPTIMIZATION
+    TEGRA_ROUND(value);
+# else
     return (int)lrint(value);
+# endif
 #else
     // while this is not IEEE754-compliant rounding, it's usually a good enough approximation
     return (int)(value + (value >= 0 ? 0.5 : -0.5));
diff --git a/modules/core/perf/perf_core_arithm.cpp b/modules/core/perf/perf_core_arithm.cpp
index 83d8d1ee88..7e48ca7159 100644
--- a/modules/core/perf/perf_core_arithm.cpp
+++ b/modules/core/perf/perf_core_arithm.cpp
@@ -62,3 +62,16 @@ PERF_TEST_P__CORE_ARITHM_SCALAR(subtract, TYPICAL_MATS_CORE_ARITHM)
 PERF_TEST_P__CORE_ARITHM_SCALAR(absdiff, TYPICAL_MATS_CORE_ARITHM)
 
 
+PERF_TEST(convert, cvRound)
+{
+    double number = theRNG().uniform(-100, 100);
+
+    int result = 0;
+
+    TEST_CYCLE(1000)
+    {
+        for (int i = 0; i < 500000; ++i)
+            result += cvRound(number);
+    }
+}
+
diff --git a/modules/stitching/perf/perf_stich.cpp b/modules/stitching/perf/perf_stich.cpp
index 085d397ea1..5b65c89bd5 100644
--- a/modules/stitching/perf/perf_stich.cpp
+++ b/modules/stitching/perf/perf_stich.cpp
@@ -19,12 +19,18 @@ PERF_TEST( stitch3, a123 )
     imgs.push_back( imread( getDataPath("stitching/a2.jpg") ) );
     imgs.push_back( imread( getDataPath("stitching/a3.jpg") ) );
 
-    Stitcher stitcher = Stitcher::createDefault();
     Stitcher::Status status;
 
     declare.time(30 * 20);
 
-    TEST_CYCLE(20) { status = stitcher.stitch(imgs, pano); }
+    while(next())
+    {
+        Stitcher stitcher = Stitcher::createDefault();
+
+        startTimer();
+        status = stitcher.stitch(imgs, pano);
+        stopTimer();
+    }
 }
 
 PERF_TEST( stitch2, b12 )
@@ -35,10 +41,16 @@ PERF_TEST( stitch2, b12 )
     imgs.push_back( imread( getDataPath("stitching/b1.jpg") ) );
     imgs.push_back( imread( getDataPath("stitching/b2.jpg") ) );
 
-    Stitcher stitcher = Stitcher::createDefault();
     Stitcher::Status status;
 
     declare.time(30 * 20);
 
-    TEST_CYCLE(20) { status = stitcher.stitch(imgs, pano); }
+    while(next())
+    {
+        Stitcher stitcher = Stitcher::createDefault();
+
+        startTimer();
+        status = stitcher.stitch(imgs, pano);
+        stopTimer();
+    }
 }