diff --git a/src/bundles/graphics/_graphics/mesh_edges.cpp b/src/bundles/graphics/_graphics/mesh_edges.cpp
index e0537a835..93b8202a1 100644
--- a/src/bundles/graphics/_graphics/mesh_edges.cpp
+++ b/src/bundles/graphics/_graphics/mesh_edges.cpp
@@ -13,7 +13,9 @@
  * === UCSF ChimeraX Copyright ===
  */
 
-#include <set>				// use std::set
+#include <vector>
+#include <algorithm>
+#include <functional>
 
 #include <arrays/pythonarray.h>		// use array_from_python()
 #include <arrays/rcarray.h>		// use Numeric_Array, Array<T>
@@ -25,6 +27,14 @@
 namespace Map_Cpp
 {
 
+static_assert(sizeof(int) * 2 == sizeof(size_t), "Size of int is not half of size_t - hash needs a re-think!");
+
+
+size_t edge_hash (int i0, int i1) noexcept
+{
+  return ((size_t)i0 << 32 | i1); 
+}
+
 // ----------------------------------------------------------------------------
 // Find edges of displayed triangles.  Edges that appear in 2 or more triangles
 // are only listed once.
@@ -32,11 +42,13 @@ namespace Map_Cpp
 static IArray calculate_masked_edges(const IArray &triangles,
 				     const BArray &tmask, const BArray &emask)
 {
-  std::set< std::pair<int,int> > edges;
+
+  std::vector< size_t > edges;
 
   unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL);
   unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL);
-  int n = triangles.size(0);
+  size_t n = triangles.size(0);
+
   int *tarray = triangles.values();
   for (int k = 0 ; k < n ; ++k, tarray += 3)
     {
@@ -47,20 +59,25 @@ static IArray calculate_masked_edges(const IArray &triangles,
 	    if (ebits & (EDGE0_DISPLAY_MASK << j))
 	      {
 		int i0 = tarray[j], i1 = tarray[(j+1)%3];
-		edges.insert(i0 < i1 ? std::pair<int,int>(i0, i1) :
-			     std::pair<int,int>(i1, i0));
+		edges.push_back(i0 < i1 ? edge_hash(i0, i1) : edge_hash(i1, i0));
 	      }
 	}
     }
+  std::sort(edges.begin(), edges.end());
+  auto last = std::unique(edges.begin(), edges.end());
+  edges.erase(last, edges.end());
+
 
   int64_t size[2] = {(int64_t)edges.size(), 2};
   IArray masked_edges(2, size);
   int *eiarray = masked_edges.values();
-  for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ; 
+  for (auto ei = edges.begin() ; 
        ei != edges.end() ; ++ei)
     {
-      *eiarray = (*ei).first; eiarray += 1;
-      *eiarray = (*ei).second; eiarray += 1;
+      auto i0 = (*ei)>>32;
+      auto i1 = (*ei)&0x00000000FFFFFFFF;
+      *eiarray = i0; eiarray += 1;
+      *eiarray = i1; eiarray += 1;
     }
 
   return masked_edges;
