diff --git a/src/sview/grid.c b/src/sview/grid.c
index 378584e7a683768d961cc0be93c47e7a9d224f73..fa1a96cf0092a6416d623dec86aa3b4e14c2cac0 100644
--- a/src/sview/grid.c
+++ b/src/sview/grid.c
@@ -1050,10 +1050,9 @@ extern char *change_grid_color(List button_list, int start, int end,
 
 	itr = list_iterator_create(button_list);
 	while ((grid_button = list_next(itr))) {
-		if (start != -1)
-			if ((grid_button->inx < start)
-			    ||  (grid_button->inx > end))
-				continue;
+		if ((start != -1) &&
+		    ((grid_button->inx < start) || (grid_button->inx > end)))
+			continue;
 		_change_button_color(grid_button, color_inx, new_col,
 				     color, only_change_unused, state_override);
 	}
@@ -1062,6 +1061,50 @@ extern char *change_grid_color(List button_list, int start, int end,
 	return sview_colors[color_inx];
 }
 
+/* This variation of change_grid_color() is faster when changing many 
+ * button colors at the same time since we can issue a single call to
+ * _change_button_color() and eliminate a nested loop. */
+extern void change_grid_color_array(List button_list, int array_len,
+				    int *color_inx, bool *color_set_flag,
+				    bool only_change_unused,
+				    enum node_states state_override)
+{
+	ListIterator itr = NULL;
+	grid_button_t *grid_button = NULL;
+	GdkColor color;
+	char *new_col = NULL;
+
+	if (!button_list)
+		return;
+
+	itr = list_iterator_create(button_list);
+	while ((grid_button = list_next(itr))) {
+		if ((grid_button->inx < 0) || (grid_button->inx >= array_len))
+			continue;
+		if (!color_set_flag[grid_button->inx])
+			continue;
+
+		if (color_inx[grid_button->inx] >= 0) {
+			color_inx[grid_button->inx] %= sview_colors_cnt;
+			new_col = sview_colors[color_inx[grid_button->inx]];
+		} else if (color_inx[grid_button->inx] == MAKE_BLACK) {
+			new_col = blank_color;
+		} else if (color_inx[grid_button->inx] == MAKE_TOPO_1) {
+			new_col = topo1_color;
+		} else if (color_inx[grid_button->inx] == MAKE_TOPO_2) {
+			new_col = topo2_color;
+		} else
+			new_col = white_color;
+		gdk_color_parse(new_col, &color);
+
+		_change_button_color(grid_button, color_inx[grid_button->inx],
+				     new_col, color, only_change_unused,
+				     state_override);
+	}
+	list_iterator_destroy(itr);
+	return;
+}
+
 extern void highlight_grid(GtkTreeView *tree_view,
 			   int node_inx_id, int color_inx_id, List button_list)
 {
diff --git a/src/sview/node_info.c b/src/sview/node_info.c
index 79ed446f4f8e960826775713b63c3568ea3f8333..1179e9a8d1cb129a13ea78b7e7e80cb3ce4f5865 100644
--- a/src/sview/node_info.c
+++ b/src/sview/node_info.c
@@ -1255,6 +1255,9 @@ display_it:
 					 &path, &focus_column);
 	}
 	if (!path || working_sview_config.grid_topological) {
+		int array_size = node_info_ptr->record_count;
+		int  *color_inx = xmalloc(sizeof(int) * array_size);
+		bool *color_set_flag = xmalloc(sizeof(bool) * array_size);
 		itr = list_iterator_create(info_list);
 		while ((sview_node_info_ptr = list_next(itr))) {
 			if (g_topo_info_msg_ptr) {
@@ -1269,11 +1272,15 @@ display_it:
 				}
 			} else
 				b_color_ndx = i;
-			change_grid_color(grid_button_list, i, i,
-					  b_color_ndx, true, 0);
+			color_set_flag[i] = true;
+			color_inx[i] = b_color_ndx;
 			i++;
 		}
 		list_iterator_destroy(itr);
+		change_grid_color_array(grid_button_list, array_size,
+					color_inx, color_set_flag, true, 0);
+		xfree(color_inx);
+		xfree(color_set_flag);
 	} else
 		highlight_grid(GTK_TREE_VIEW(display_widget),
 			       SORTID_POS, (int)NO_VAL, grid_button_list);
diff --git a/src/sview/sview.h b/src/sview/sview.h
index 44163326d7e6085a28ace7cbbb95a9936609f6d3..230c0937b46c97e6f280d02b6a2f3885db439cf6 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -400,6 +400,10 @@ extern grid_button_t *create_grid_button_from_another(
 extern char *change_grid_color(List button_list, int start, int end,
 			       int color_inx, bool change_unused,
 			       enum node_states state_override);
+extern void change_grid_color_array(List button_list, int array_len,
+				    int *color_inx, bool *color_set_flag,
+				    bool only_change_unused,
+				    enum node_states state_override);
 extern void highlight_grid(GtkTreeView *tree_view,
 			   int node_inx_id, int color_inx_id, List button_list);
 extern void highlight_grid_range(int start, int end, List button_list);